Строка в десятичную с 2 десятичными разрядами всегда - PullRequest
0 голосов
/ 31 мая 2018

У меня есть строка, которая должна быть преобразована в десятичную.Строка может быть введена без десятичных разрядов, например, «123» или 2 десятичных разрядов, например, «123,45» или несколько неловко, с 1 десятичным знаком «123,3».Я хочу, чтобы число отображалось (свойство invoice.Amount типа decimal) с двумя десятичными знаками.Код ниже делает это.Я думаю, что это может быть написано лучше, хотя.Как?

decimal newDecimal;
bool isDecimal = Decimal.TryParse(InvoiceDialog.InvoiceAmount, out newDecimal);
string twoDecimalPlaces = newDecimal.ToString("########.00");
invoice.Amount = Convert.ToDecimal(twoDecimalPlaces);

Частично, я не понимаю, для форматирования строки "########. 00", что # делает и что 0 делает.Например, как бы это было иначе, если бы это было "########. ##"?

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

Вам не нужно преобразовывать decimal в string, чтобы выполнить форматирование для 2 десятичных знаков.Вы можете использовать метод decimal.Round напрямую.Вы можете прочитать об этом здесь .

Таким образом, ваш код может быть преобразован в

    decimal newDecimal;
    Decimal.TryParse(s, out newDecimal);

    newDecimal = decimal.Round(newDecimal, 2, MidpointRounding.AwayFromZero);

Приведенный выше код также можно упростить с помощью выражения объявления C # 7.0 как

    Decimal.TryParse(s, out decimal newDecimal);

    newDecimal = decimal.Round(newDecimal, 2, MidpointRounding.AwayFromZero);

Теперь newDecimal будет иметь значение с точностью до 2.

Вы можете проверить это live fiddle.

0 голосов
/ 31 мая 2018

# - это необязательная цифра, когда 0 является обязательной цифрой

Например,

 decimal d = 12.3M;

 // d with exactly 2 digits after decimal point
 Console.WriteLine(d.ToString("########.00"));
 // d with at most 2 digits after decimal point 
 Console.WriteLine(d.ToString("########.##"));

Результат:

12.30   // exactly 2 digits after decimal point: fractional part padded by 0
12.3    // at most 2 digits after decimal point: one digit - 3 - is enough
0 голосов
/ 31 мая 2018

«#» является необязательным, в то время как «0» будет показывать либо число, либо 0.

Например,

var x = 5.67;
x.ToString("##.###"); // 5.67
x.ToString("00.000"); // 05.670
x.ToString("##.##0"); // 5.670

Если вам просто важно, сколько десятичных разрядов выЯ бы рекомендовал использовать

x.ToString("f2"); // 5.67

, чтобы получить 2 десятичных знака.

Дополнительную информацию можно найти по адресу http://www.independent -software.com / net-string-formatting-в-CSharp-чит-sheet.html / .

0 голосов
/ 31 мая 2018

В основном, # означает необязательный, где 0 является обязательным.Что касается лучшего объяснения, если вы поставите #, тогда если число доступно для заполнения заполнителя, оно будет добавлено, если нет, оно будет проигнорировано.

Установка 0, однако, отличается, так как она всегда устанавливает значениедля вас.

Вы можете объединить их вместе.

String.Format("{0:0.##}", 222.222222); // 222.22

String.Format("{0:0.##}", 222.2); // 222.2

String.Format("{0:0.0#}", 222.2)// 222.2

...