C# 将字符串转换为十进制,保留分数
我正在尝试将C# 将字符串转换为十进制,保留分数,c#,string,decimal,C#,String,Decimal,我正在尝试将1200.00转换为decimal,但是decimal.Parse()会删除.00。我尝试了一些不同的方法,但它总是删除.00,除非我提供的分数不同于0 string value = "1200.00"; 方法1 方法2 方法3 如何将包含1200.00的string转换为包含1200.00的decimal?我认为您的问题在于显示小数时,而不是小数的内容 如果你尝试 string value = "1200.00"; decimal d = decimal.Parse(s); st
1200.00
转换为decimal
,但是decimal.Parse()
会删除.00
。我尝试了一些不同的方法,但它总是删除.00
,除非我提供的分数不同于0
string value = "1200.00";
方法1
方法2
方法3
如何将包含
1200.00
的string
转换为包含1200.00
的decimal
?我认为您的问题在于显示小数时,而不是小数的内容
如果你尝试
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”。似乎我每天都在学习一些东西,在这种情况下,很明显我学到了一些非常基本的东西
因此,忽略这一点,这是一个正确的答案。在这种情况下,我们可能需要更多代码来识别您的问题。嗯。。。我无法复制这个:
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));
}
}
下面的代码将值打印为1200.00
var convertDecimal = Convert.ToDecimal("1200.00");
Console.WriteLine(convertDecimal);
不确定您期望的是什么?使用此示例
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);
即使打印的表示不是您期望的值,该值也是相同的:
decimal d = (decimal )1200.00;
Console.WriteLine(Decimal.Parse("1200") == d); //True
这是你必须做的
decimal d = 1200.00;
string value = d.ToString(CultureInfo.InvariantCulture);
// value = "1200.00"
这对我有用。谢谢。你好,我也有同样的问题,但很简单,只要这样做:
string cadena=“96.23”代码>
decimal NoDecimal=decimal.parse(cadena.replace(“.”,“,”))
我想这是因为十进制数字上接受C的符号带有“,”这是我为自己想出的一个解决方案。这已准备好作为命令提示符项目运行。如果不是的话,你需要清理一些东西。希望这有帮助。它接受多种输入格式,如:1.234.567、89 1234567.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("----------------");
}
}
}
}
您可以尝试在程序中调用此方法:
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
}
十进制d=3.00仍然是3。
我猜你想在屏幕上的某个地方显示它,或者在日志文件中打印为3.00。
你可以做以下事情
string str = d.ToString("F2");
或者,如果您使用数据库存储十进制数,则可以在数据库中设置精度值。使用CultureInfo类对我很有效,希望能对您有所帮助
string value = "1200.00";
CultureInfo culture = new CultureInfo("en-US");
decimal result = Convert.ToDecimal(value, culture);
我认为零是隐含的。即使看不到“.00”部分,小数部分也存在。出于格式化的目的,您应该显示它们,但您不必担心。@nmiranda:No,decimal
保持适当的比例decimal.Parse(“1200.000”)
和decimal.Parse(“1200.00”)
将返回不同的值,保留尾随0的数量。我同意@NelsonMiranda。事实上,decimal.Parse(“1200.000”).Equals(decimal.Parse(“1200.00”))返回true,所以我看不出这个问题的意义……我可以确认这对于非美国的本地化来说是个问题。I我的电脑设置为意大利语言环境和十进制。Parse(“1200.00”)返回120000,而decimal.Parse(“1200,00”)返回1200.00Yup和:decimal d=decimal.Parse(“1200.000”);控制台。写入线(d);//打印1200.000,因此这不是一个文化问题。请投票表决,以获得下面的澄清意见。请尝试将“.”小数分隔符更改为“,”。如果结果不同,这是一种文化现象。@Øyvind-十进制内部表示法存储小数点零,即使它们在数学上不相关。因此,当decimal.Parse(“1200.00”)==decimal.Parse(“1200”)
时,.ToString()
的值分别为“1200.00”和“1200”。OP不需要在.ToString()
方法中指定小数位数。@Enigmativity-谢谢解释:)这感觉像是很久以前我就应该知道的事情……你确定吗?这似乎取决于机器设置。
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
string str = d.ToString("F2");
string value = "1200.00";
CultureInfo culture = new CultureInfo("en-US");
decimal result = Convert.ToDecimal(value, culture);