2012-03-29 98 views
1

我试图做的非常相似,this c# docs example东西:数字格式在C#中 - 独立的int和小数部分

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

但非常希望避免除非在.NET中使用复合格式不能达到正确的分离没有其他办法

+7

'int值= 123.123,'你真的不这样做:) – Reniuz 2012-03-29 13:24:19

+1

@Reniuz错误的复制/粘贴,很明显。 – Razor 2012-03-29 13:35:28

+1

123.095是$ 123.00美元,取决于你如何确定'09.5'美分和'10.00'美分之间的值......根据评论它肯定不是'0950'美分。由于必须修正的错误数量,我仍然不得不放弃这个问题。 – 2012-03-29 13:52:07

回答

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美分)”

+0

我不认为这是正确的,因为它只有9.5美分而不是950美分。但我喜欢滥用数字格式化程序。 – user7116 2012-03-29 14:15:49

+0

@sixlettervariables - :)感谢您指出有关0950美分...即使这是OP要求的,它似乎很奇怪。 – 2012-03-29 14:28:58

+0

如果OP想要做一些输出“123美元和09.50美分”的东西,那么我认为这个答案会打破,因为我没有看到任何方式使用NumberFormatInfo为数字的小数部分提供“分组”。 – 2012-03-29 14:38:38

1

。你必须在零件上自己分开:

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舍入模式,以窃取您的金钱或导致你欠更多。

+0

这似乎是对作者问题的唯一正确答案。 – 2012-03-29 13:53:51

+0

在我的情况下不能使用小数。惭愧,我不能使用复合格式,要么 - 谢谢。 – Razor 2012-03-29 14:05:25

+0

小心负面的价值 – 2012-03-29 14:12:03

0

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