Преобразовать строку в десятичную, сохраняя дроби - PullRequest
57 голосов
/ 24 ноября 2010

Я пытаюсь преобразовать 1200.00 в decimal, но Decimal.Parse() удаляет .00. Я пробовал несколько разных методов, но он всегда удаляет .00, кроме случаев, когда я предоставляю дробь, отличную от 0.

string value = "1200.00";

Метод 1

 var convertDecimal = Decimal.Parse(value ,  NumberStyles.AllowThousands
       | NumberStyles.AllowDecimalPoint | NumberStyles.AllowCurrencySymbol);

Метод 2

 var convertDecimal = Convert.ToDecimal(value);

Метод 3

var convertDecimal = Decimal.Parse(value,
       NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture);

Как мне преобразовать string, содержащий 1200.00, в decimal, содержащий 1200.00?

Ответы [ 11 ]

77 голосов
/ 24 ноября 2010

Хм ... Я не могу воспроизвести это:

using System;

class Test
{
    static void Main()        
    {
        decimal d = decimal.Parse("1200.00");
        Console.WriteLine(d); // Prints 1200.00
    }
}

Вы уверены, что это не какая-то другая часть вашего кода, нормализующая десятичное значение позже?

На случай, если это культурные проблемы, попробуйте эту версию, которая вообще не должна зависеть от вашей локали:

using System;
using System.Globalization;

class Test
{
    static void Main()        
    {
        decimal d = decimal.Parse("1200.00", CultureInfo.InvariantCulture);
        Console.WriteLine(d.ToString(CultureInfo.InvariantCulture));
    }
}
11 голосов
/ 18 августа 2015

Здравствуйте, у меня была та же проблема, но это легко, просто сделайте это:

string cadena="96.23";

decimal NoDecimal=decimal.parse(cadena.replace(".",","))

Я думаю, что это из-занотация, которая принимает C # для десятичных чисел, с ","

11 голосов
/ 24 ноября 2010

Я думаю, что ваша проблема при отображении десятичного числа, а не его содержимого.

Если вы попробуете

string value = "1200.00";
decimal d = decimal.Parse(s);
string s = d.ToString();

s будет содержать строку "1200".

Однако, если вы измените свой код на этот

string value = "1200.00";
decimal d = decimal.Parse(s);
string s = d.ToString("0.00");

s будет содержать строку "1200.00" так, как вы хотите.

EDIT

Кажется, у меня сегодня мозговая смерть рано утром. Я добавил Parse заявления сейчас. Однако даже мой первый код выдаст «1200.00», даже если я ожидал, что он выведет «1200». Похоже, я чему-то учусь каждый день, и в этом случае, очевидно, что-то довольно простое.

Так что не обращайте на это внимания. Возможно, нам понадобится больше кода, чтобы определить вашу проблему в этом случае.

5 голосов
/ 24 ноября 2010

Приведенный ниже код печатает значение как 1200.00.

var convertDecimal = Convert.ToDecimal("1200.00");
Console.WriteLine(convertDecimal);

Не уверен, что вы ожидаете?

2 голосов
/ 05 июня 2018

Использование класса CultureInfo помогло мне, надеюсь, поможет вам.

    string value = "1200.00";
    CultureInfo culture = new CultureInfo("en-US");
    decimal result = Convert.ToDecimal(value, culture);
2 голосов
/ 17 октября 2016

Вот решение, которое я придумал для себя.Это готово к запуску как проект командной строки.Вам нужно почистить некоторые вещи, если нет.Надеюсь это поможет.Он принимает несколько форматов ввода, таких как: 1,234,567,89 1,234,567.89 и т. Д.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Globalization;
    using System.Linq;

    namespace ConvertStringDecimal
    {
        class Program
        {
            static void Main(string[] args)
            {
                while(true)
                {
                    // reads input number from keyboard
                    string input = Console.ReadLine();
                    double result = 0;
                    // remove empty spaces
                    input = input.Replace(" ", "");
                    // checks if the string is empty
                    if (string.IsNullOrEmpty(input) == false)
                    {
                        // check if input has , and . for thousands separator and decimal place
                        if (input.Contains(",") && input.Contains("."))
                        {
                            // find the decimal separator, might be , or .
                            int decimalpos = input.LastIndexOf(',') > input.LastIndexOf('.') ? input.LastIndexOf(',') : input.LastIndexOf('.');
                            // uses | as a temporary decimal separator
                            input = input.Substring(0, decimalpos) + "|" + input.Substring(decimalpos + 1);
                            // formats the output removing the , and . and replacing the temporary | with .
                            input = input.Replace(".", "").Replace(",", "").Replace("|", ".");
                        }
                        // replaces , with .
                        if (input.Contains(","))
                        {
                            input = input.Replace(',', '.');
                        }
                        // checks if the input number has thousands separator and no decimal places
                        if(input.Count(item => item == '.') > 1)
                        {
                            input = input.Replace(".", "");
                        }
                        // tries to convert input to double
                        if (double.TryParse(input, out result) == true)
                        {
                            result = Double.Parse(input, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.InvariantCulture);
                        }
                    }
                    // outputs the result
                    Console.WriteLine(result.ToString());
                    Console.WriteLine("----------------");
                }
            }
        }
    }
2 голосов
/ 07 марта 2014

Используйте этот пример

System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("en-GB",true);

decimal currency_usd = decimal.Parse(GetRateFromCbrf("usd"),culInfo);
decimal currency_eur = decimal.Parse(GetRateFromCbrf("eur"), culInfo);
0 голосов
/ 10 апреля 2018

десятичное d = 3.00 по-прежнему 3. Я думаю, вы хотите показать его где-нибудь на экране или распечатать его в файле журнала как 3.00.Вы можете выполнить следующие действия:

string str = d.ToString("F2");

или, если вы используете базу данных для хранения десятичной дроби, вы можете установить значение цены в базе данных.

0 голосов
/ 26 июля 2017

Вы можете попробовать вызвать этот метод в вашей программе:

static double string_double(string s)
    {
        double temp = 0;
        double dtemp = 0;
        int b = 0;
        for (int i = 0; i < s.Length; i++)
        {
            if (s[i] == '.')
            {
                i++;
                while (i < s.Length)
                {
                    dtemp = (dtemp * 10) + (int)char.GetNumericValue(s[i]);
                    i++;
                    b++;
                }
                temp = temp + (dtemp * Math.Pow(10, -b));
                return temp;
            }
            else
            {
                temp = (temp * 10) + (int)char.GetNumericValue(s[i]);
            }
        }
        return -1; //if somehow failed
    }

Пример:

string s = "12.3";
double d = string_double (s);        //d = 12.3 
0 голосов
/ 12 мая 2015

это то, что вы должны сделать.

decimal d = 1200.00;    
string value = d.ToString(CultureInfo.InvariantCulture);

// value = "1200.00" 

Это сработало для меня. Спасибо.

...