Format currency without rounding

自作多情 提交于 2019-12-01 10:37:45

You could do something like this...

var money = 1234.556789D;
Console.WriteLine(money.ToString(GetFormat(money)));

money = .1D;

Console.WriteLine(money.ToString(GetFormat(money)));

using the following method to get the format string...

static string GetFormat(double input)
{
    // get the number of decimal places to show
    int length = input.ToString().Length - input.ToString().IndexOf(".") - 1;

    // return the currency format string to use with decimal.ToString()
    return string.Format("C{0}", length < 2 ? 2 : length);
}

If you wanted to take it a step further, you could also wrap all of this into an extension method so that you didn't have to call the GetFormat() method from inside ToString() - that might make things look a bit cleaner.

ToString("C20") -- C takes a precision suffix

EDIT: oops, didn't read the question apparently.

.ToString("C20").Trim('0') seems like the fix, but this doesn't work when you're using string.Format...

Seeing that there doesn't seem to be a built-in way of doing this, I ended up rolling my own extension method that looks like...

Public Function ToUnroundedCurrency(ByVal value As Decimal) As String
    Dim valueAsString As String = value.ToString() ' Some loss of precision happens here, but it is not a concern.

    Dim decimalLocation As Integer = valueAsString.IndexOf(".")

    ' Get number of digits after the decimal place in the number
    Dim numberOfDecimalPlaces As Integer = 0
    If (decimalLocation > 0) Then numberOfDecimalPlaces = valueAsString.Length - decimalLocation - 1

    ' The currency formatter has a limit of 99 decimal places -- due to the decimal -> ToString() conversion above, this will never happen, but being defensive anyway.
    If (numberOfDecimalPlaces > 99) Then
        numberOfDecimalPlaces = 99
    ElseIf (numberOfDecimalPlaces < CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalDigits) Then
        ' also make sure we at least have the minimum required decimal places
        numberOfDecimalPlaces = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalDigits
    End If

    Return value.ToString("C" & numberOfDecimalPlaces)
End Function

I noted some negligible loss of precision. We (or anybody probably) wouldn't be dealing with decimal values fractional enough enough to ever run into the limitations.

Yes. Here's the answer from another forum:

http://forums.asp.net/p/1266337/2380486.aspx

You could try writing a regular expression to get rid of all of those trailing 0's.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!