Каков наилучший способ взять строку, которая может быть пустой или содержать "1.2", например, и преобразовать ее в целое число? int.TryParse
, конечно, не работает, и я не хочу использовать float.TryParse
, а затем конвертировать в int
.
С# Преобразование строки, содержащей с плавающей запятой целое число
Ответ 1
var a = (int)Convert.ToDouble("1.2");
Обратите внимание, что если вы используете запятую в качестве разделителя чисел в своей операционной системе, вы должны использовать IFormatProvider:
var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat);
Другой способ выполнить эту задачу:
var a = int.Parse("1.2".Split('.')[0]);
Помните о:
- Если вы хотите обрабатывать пустые и нулевые строки, напишите метод и добавьте строку. IsNullOrEmpty условие.
- Чтобы получить десятичный разделитель, вы можете использовать свойство NumberFormatInfo.NumberDecimalSeparator.
- Вы также должны следить за округлением, чтобы избежать ловушек.
- Выберите casting, Parse, TryParse или Преобразовать класс с умом. Читайте больше на:
Ответ 2
Я не знаю, что случилось с разбором float
и преобразованием в int
. Я сомневаюсь, что любой другой способ был бы более эффективным, но вот попытка:
//allows empty strings and floating point values
int ParseInt(string s, bool alwaysRoundDown = false)
{
//converts null/empty strings to zero
if (string.IsNullOrEmpty(s)) return 0;
if (!s.Contains(".")) return int.Parse(s);
string parts = s.Split(".");
int i = int.Parse(parts[0]);
if (alwaysRoundDown || parts.Length==1) return i;
int digitAfterPoint = int.Parse(parts[1][0]);
return (digitAfterPoint < 5) ? i : i+1;
}
Чтобы глобализовать код, вам нужно заменить "."
на System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
.
Ответ 3
Возможно, вы можете попытаться удалить все после плавающей запятой, используя строковые функции, а затем преобразовать в int. Но серьезно я не думаю, что это лучше, чем преобразование в float, а затем в int.
Ответ 4
int a = (int)Math.Round(float.Parse("0.9"));
Вам нужно сначала округлить его, если вы не хотите, чтобы 0,9 преобразовывалось в 0 вместо 1.
Ответ 5
Я думаю, что другой способ сделать это - это расщепление строки на куски, в которой будет десятичный (.) как разделитель, а затем разбор целого числа. Конечно, я еще должен спросить вас, может ли строка содержать такие значения, как значения типа "37.56 miles in 32.65 seconds"
.
Учитывая, что в строке будет только одно значение (строка или число), я могу что-то придумать в следующей строке:
public int64 GetInt64(string input)
{
if (string.IsNullOrEmpty(input)) return 0;
// Split string on decimal (.)
// ... This will separate all the digits.
//
string[] words = input.Split('.');
return int.Parse(words[0]);
}
Ответ 6
Вы можете использовать библиотеку времени исполнения Visual Basic для выполнения этого из С#.
Вам нужно добавить ссылку на сборку Microsoft.VisualBasic.dll на свое решение.
Затем следующий код выполнит ваше преобразование:
using VB = Microsoft.VisualBasic.CompilerServices;
class Program
{
static void Main(string[] args)
{
int i = VB.Conversions.ToInteger("1.2");
}
}
Ответ 7
У меня была такая же проблема и в итоге я использовал гибрид Mark и Dariusz ':
if (num == "")
{
num = "0.00";
}
var num1 = (float)Convert.ToDouble(num);