Преобразование строки в десятичную, сохранение фракций
Я пытаюсь преобразовать 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
?
Ответы
Ответ 1
Хм... Я не могу воспроизвести это:
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));
}
}
Ответ 2
Я думаю, что ваша проблема заключается в отображении десятичной, а не ее содержимого.
Если вы попробуете
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"
, как вы этого хотите.
ИЗМЕНИТЬ
Кажется, я сегодня утром говорю о себе. Я добавил инструкции Parse
. Однако даже мой первый код выведет "1200.00", даже если я ожидаю, что он выведет "1200". Кажется, я каждый день что-то изучаю, и в этом случае очевидно что-то, что является довольно простым.
Поэтому не обращайте на это правильного ответа. Вероятно, нам понадобится больше кода для определения вашей проблемы в этом случае.
Ответ 3
Привет, у меня была такая же проблема, но это легко, просто выполните следующее:
string cadena="96.23";
decimal NoDecimal=decimal.parse(cadena.replace(".",","))
Я думаю, что это означает, что обозначение С# на десятичных числах имеет ","
Ответ 4
Нижеприведенный код печатает значение как 1200.00.
var convertDecimal = Convert.ToDecimal("1200.00");
Console.WriteLine(convertDecimal);
Не знаете, чего вы ожидаете?
Ответ 5
Вот решение, которое я придумал для себя. Он готов к запуску в качестве проекта командной строки. Вам нужно очистить некоторые вещи, если нет. Надеюсь это поможет. Он принимает несколько входных форматов, таких как: 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("----------------");
}
}
}
}
Ответ 6
Используйте этот пример
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);
Ответ 7
Значение такое же, даже если напечатанное представление не соответствует ожидаемому:
decimal d = (decimal )1200.00;
Console.WriteLine(Decimal.Parse("1200") == d); //True
Ответ 8
Вы можете попробовать вызвать этот метод в своей программе:
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
Ответ 9
это то, что вам нужно сделать.
decimal d = 1200.00;
string value = d.ToString(CultureInfo.InvariantCulture);
// value = "1200.00"
Это сработало для меня. Спасибо.