C # разбирает "4.1" и "4.10" как "4.1". Как разобрать номер как "4.10"? - PullRequest
0 голосов
/ 25 августа 2018

Я анализирую файл Excel в C #. Я организую процедуры с числовыми идентификаторами (например, 4.1, 4.2, 4.3, ..., 4.10, 4.11). Все это работает, за исключением того, что любое число, заканчивающееся на ".10", анализируется как ".1". Значение, которое я использую .ToString(), относится к типу dynamic.

Так что у меня даже нет string первого. Как я могу получить ".10" как .10 (а не как .1)?

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Проблема здесь в том, что я держу пари, что вы хотите а) проанализировать строки как есть и б) затем отсортировать по значению, где 4.9 предшествует 4.10, и 4.11. Если вы проанализируете это для какого-либо одного значения объекта, вы не получите то, что хотите. Вам нужно будет поместить это в строку, а затем преобразовать как-нибудь. Самый простой способ сделать это - разбить строку и отсортировать по 1-му числу, а затем по второму.

0 голосов
/ 25 августа 2018

Численно, 4.1 = 4.10, поэтому double.Parse () здесь не ваш друг.

Проблема в том, что вы на самом деле не разбираете число , вы анализируете иерархию , которая использует точечные числа на каждом уровне.

Таким образом, вместо разбора на double лучше разбирать массив целых чисел . Примерно так:

Array.ConvertAll("4.10".Split('.'), n => int.Parse(n));

Это позволит вам обрабатывать любое количество «уровней» в иерархии и любое количество цифр на каждом уровне.

Если вы хотите сохранить иерархию, скажем, в столбце базы данных, который будет сохранять заданный порядок, просто создайте массив в виде строки , причем левые нули дополняют каждый уровень до числа цифры, с которыми вам удобно.

Если у вас есть только два уровня, вы можете избежать сохранения вашего номера в виде decimal, но вам все равно нужно будет набирать цифры слева, т.е. хранить 4.1 как число 4.001, 4.10 как 4.01, и т.д.

0 голосов
/ 25 августа 2018

Ответ зависит от того, в какого типа вы анализируете исходное string.

В случае double или float например

  double value = double.Parse("4.10", CultureInfo.InvariantCulture);

вы не можете получить что-либо подобное 4.10d, поскольку математика означает, что 4.1 == 4.10 == 4.100 == ...;все, что вы можете сделать, это представить double как string с помощью форматирования:

  // represent value (4.1) with 2 digits after the decimal point: 4.10
  Console.WriteLine(value.ToString("F2"));

В случае decimal (который имеет коэффициент масштабирования, чтобы вы могли иметь 410 с коэффициентом масштабирования 2: 410 / 10**2 == 4.10 или 41 с коэффициентом масштабирования 1: 41 / 10**1 == 4.1) вы можете получить желаемое значение: вам следуетдобавьте 0.00m для этого:

  decimal value = decimal.("4.1", CultureInfo.InvariantCulture) + 0.00m;

  // 4.10
  Console.WriteLine(value);

см. https://docs.microsoft.com/en-us/dotnet/api/system.decimal?redirectedfrom=MSDN&view=netframework-4.7.2 для деталей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...