Konrad
Konrad

Reputation: 558

Decimal - truncate trailing zeros

I noticed that .NET has some funky/unintuitive behavior when it comes to decimals and trailing zeros.

0m == 0.000m //true
0.1m == 0.1000m //true

but

(0m).ToString() == (0.000m).ToString() //false
(0.1m).ToString() == (0.1000m).ToString() //false

I know about necessity to comply to the ECMA CLI standard. However I would like to know if there is built-in way to truncate the trailing zeros for a decimal value without going through string representation (.ToString("G29") and parse back trick would work, but is neither fast nor elegant solution)?

Any ideas? Thanks a lot.

Upvotes: 19

Views: 7526

Answers (3)

Thomas Materna
Thomas Materna

Reputation: 3809

I think that what you need is this (more details in my answer here) :

public static decimal Normalize(decimal value)
{
    return value/1.000000000000000000000000000000000m;
}

Upvotes: 21

Ray
Ray

Reputation: 21905

Use a format string to specify the output of ToString():

(0.1m).ToString("0.#") -> "0.1"
(0.10000m).ToString("0.#") -> "0.1"

Use a "0" in the format to specify a digit or a non-significate 0, use "#" to specify a significant digit or suppress a a non-significate 0.

Edit: I assuming here that you are worried about the visual (string) representation of the number - if not, I will remove my answer.

Upvotes: 7

Marc Gravell
Marc Gravell

Reputation: 1062560

I don't like it much, but it works (for some range of values, at least)...

    static decimal Normalize(decimal value)
    {
        long div = 1;
        while(value - decimal.Truncate(value) != 0)
        {
            div *= 10;
            value *= 10;
        }
        if(div != 1) {
            value = (decimal)(long)value / div;
        }
        return value;
    }

Upvotes: 3

Related Questions