Форматирование чисел в c # - разделять целые и десятичные части - PullRequest
2 голосов
/ 29 марта 2012

Я пытаюсь сделать что-то очень похожее на этот пример c # docs :

int value = 123;
Console.WriteLine(value.ToString(@"\#\#\# ##0 dollars and \0\0 cents \#\#\#"));
// Displays ### 123 dollars and 00 cents ###

За исключением того, что я хочу, чтобы он действительно работал с десятичными числами:

double value = 123.095;
Console.WriteLine(value.ToString(@"\#\#\# ##0 dollars and 0000 \#\#\#"));
// Should display ### 123 dollars and 0950 ###, but it doesn't (of course)

Пробовал:

Console.WriteLine(value.ToString(@"\#\#\# ##0. dollars and 0000 cents \#\#\#"));

Но печатает десятичный разделитель (конечно), который я не хочу.
Я знаю, что мог бы сделать что-то вроде этого:

String.Format("{0:##0} {1:0000}", 123, 123);

Но очень бы хотелось избежать, если нет другого пути

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Вы можете определить свой собственный особый формат валюты, но ... я не уверен, что сделаю это.Это выглядит как злоупотребление объектом NumberFormatInfo:

РЕДАКТИРОВАТЬ: изменение типа данных значения с десятичного на двойное

// works with either decimal or double
double value = 123.095;

var mySpecialCurrencyFormat = new System.Globalization.NumberFormatInfo();

mySpecialCurrencyFormat.CurrencyPositivePattern = 3;
mySpecialCurrencyFormat.CurrencyNegativePattern = 8;
mySpecialCurrencyFormat.NegativeSign = "-";
mySpecialCurrencyFormat.CurrencySymbol = "cents";
mySpecialCurrencyFormat.CurrencyDecimalDigits = 4;
mySpecialCurrencyFormat.CurrencyDecimalSeparator = " dollars and ";
mySpecialCurrencyFormat.CurrencyGroupSeparator = ",";
mySpecialCurrencyFormat.CurrencyGroupSizes = new[] { 3 };


Console.WriteLine(value.ToString("C", mySpecialCurrencyFormat));

Вывод «123 доллара и 0950 центов»

РЕДАКТИРОВАТЬ: возможно, имеет смысл использовать CurrencyNegativePattern 15 вместо 8, так что отрицательные значения приводят к заключению круглой скобки в строку, что может быть менее запутанным, чем просто ставить отрицательный знак перед долларами.Например, использование CurrencyNegativePattern = 15 приводит к выводу -123.095 в виде «(123 доллара и 0950 центов)»

2 голосов
/ 29 марта 2012

Невозможно добиться правильного разделения с помощью составного форматирования в .Net.Вам придется разделить части по своему усмотрению:

decimal value = 123.23m;

Console.WriteLine(
    @"{0:0} dollars and {1:#0} cents",
    Math.Truncate(value),                 // Dollars
    (value - Math.Truncate(value)) * 100m // Cents
);

// Output: 123 dollars and 23 cents

Кроме того, вы никогда не должны использовать float или double для хранения денег, если только вы не хотите, чтобы режимы округления IEEE-754 украливаши деньги или заставить вас больше.

0 голосов
/ 19 января 2013

Напишите программу, в которой пользователь вводит действительное число, такое как 12.842, а затем выводит целую часть и десятичную часть, используя приведение типа для выполнения требуемой операции. Вывод будет выглядеть примерно так: Целая часть: 12 Десятичная часть: 842

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