C# c中的数字格式-独立的整数和小数部分

C# c中的数字格式-独立的整数和小数部分,c#,formatting,C#,Formatting,我正在尝试做一些非常类似的事情: 但我希望它能用小数: 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(@"\#\#\# ##

我正在尝试做一些非常类似的事情:

但我希望它能用小数:

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);

但我非常希望避免,除非没有其他方法,否则在.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

另一方面,除非您希望IEEE-754取整模式窃取您的钱或导致您欠更多的钱,否则您不应该使用float或double来存储钱。

在.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
顺便说一句,除非你想让IEEE-754取整模式偷你的钱或让你欠更多的钱,否则你不应该使用float或double来存储钱。

你可以定义自己的特殊货币格式,但是。。。我不确定我是否会这样做。这似乎是对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美分,您可以定义自己的特殊货币格式,但是。。。我不确定我是否会这样做。这似乎是对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美分。编写一个程序,用户在其中输入实数,如12.842,然后在使用类型转换执行所需操作时输出整数部分和小数部分。 输出将类似于: 整数部分是:12
小数部分是:842

编写一个程序,用户在其中输入实数,如12.842,然后在使用类型转换执行所需操作时输出整数部分和小数部分。 输出将类似于: 整数部分是:12

小数部分为:842

int value=123.123;你真的没有这样做:@Reniuz复制/粘贴错误,显然.123.095是$123.00美元,这取决于你如何确定09.5美分和10.00美分之间的值。。。。根据评论,这当然不是0950美分。我仍然必须对这个问题投反对票,因为有很多错误需要纠正。没有标准的字符串格式可以针对小数点的右边,所以你必须换一种方式来处理。int value=123.123;你真的没有这样做:@Reniuz复制/粘贴错误,显然.123.095是$123.00美元,这取决于你如何确定09.5美分和10.00美分之间的值。。。。根据评论,这当然不是0950美分。我仍然必须对这个问题投反对票,因为有很多错误需要纠正。没有标准的字符串格式可以针对小数点的右边,所以你必须换一种方式来处理。这似乎是作者问题的唯一正确答案。在我的情况下,不能使用小数点。不好意思,我也不能使用复合格式-谢谢。注意负片values@Razor-你到底为什么不能使用十进位值?这似乎是对作者问题的唯一正确答案。在我的例子中不能使用十进制。不好意思,我也不能使用复合格式-谢谢。注意负片values@Razor-你到底为什么不能使用十进位值?我认为这是不对的,因为它只有9.5美分而不是950美分。但是我很喜欢你滥用数字格式化程序。@sixlettervariables-:谢谢你指出关于0950美分的问题…尽管这是OP要求的,但它确实看起来很奇怪。如果OP想要做一些输出123美元和09.50美分的事情,那么我想这个答案会崩溃,因为我看不到任何使用NumberFormatInfo为数字的小数部分提供分组的方法。有人能解释为什么作者想要950美分而不是9.5美分吗?好的,我重新阅读了这个问题,似乎OP不一定要在最后输出美分。第二个代码示例表明OP可能只需要123美元和0950美元。我不认为这是正确的,因为它只需要9.5美分而不是950美分
新界南部。但是我很喜欢你滥用数字格式化程序。@sixlettervariables-:谢谢你指出关于0950美分的问题…尽管这是OP要求的,但它确实看起来很奇怪。如果OP想要做一些输出123美元和09.50美分的事情,那么我想这个答案会崩溃,因为我看不到任何使用NumberFormatInfo为数字的小数部分提供分组的方法。有人能解释为什么作者想要950美分而不是9.5美分吗?好的,我重新阅读了这个问题,似乎OP不一定要在最后输出美分。第二个代码示例表明OP可能只需要123美元和0950美元。