c#中的数字格式 - 单独的int和decimal部分

时间:2012-03-29 13:22:17

标签: c# formatting

我正在尝试做一些与this c# docs example非常相似的事情:

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 个答案:

答案 0 :(得分:2)

可以定义您自己的特殊货币格式,但是......我不确定我是否会这样做。这似乎是滥用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美分)”

答案 1 :(得分:1)

使用.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

顺便说一句,你不应该使用floatdouble来存钱,除非你想要IEEE-754舍入模式来窃取你的钱或让你欠更多钱。

答案 2 :(得分:0)

编写程序,用户输入实数(例如12.842),然后输出整数部分和小数部分,同时使用类型转换执行所需的操作。 输出看起来像: 整数部分是:12 小数部分是:842