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
小数部分为:842int 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美元。