我想知道是否有一种简洁而准确的方法来提取十进制值中的小数位数(作为int),可以安全地在不同的文化信息中使用?
例如:
19.0应该返回
1,27.5999应该返回4,19.12
应该返回2,
等等.
我写了一个查询,在一个句点上执行字符串拆分以查找小数位:
int priceDecimalPlaces = price.ToString().Split('.').Count() > 1
? price.ToString().Split('.').ToList().ElementAt(1).Length
: 0;
Run Code Online (Sandbox Code Playgroud)
但我发现这只适用于使用'.'的地区.作为小数分隔符,因此在不同系统中非常脆弱.
C#中的这些行
decimal a = 2m;
decimal b = 2.0m;
decimal c = 2.00000000m;
decimal d = 2.000000000000000000000000000m;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Run Code Online (Sandbox Code Playgroud)
生成此输出:
2
2.0
2.00000000
2.000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
所以我可以看到从文字中创建一个十进制变量允许我控制精度.
我想将字符串格式化为十进制,但十进制在小数点后包含一些后续零.我如何格式化它以使那些无意义的0消失?
string.Format("{0}", 1100M);
string.Format("{0}", 1100.1M);
string.Format("{0}", 1100.100M);
string.Format("{0}", 1100.1000M);
Run Code Online (Sandbox Code Playgroud)
显示:
1100
1100.1
1100.100
1100.1000
Run Code Online (Sandbox Code Playgroud)
但我希望它是:
1100
1100.1
1100.1
1100.1
Run Code Online (Sandbox Code Playgroud)
作为参考,这里有其他问题基本上与此重复,我感谢这里给出的答案:
我注意到.NET在小数和尾随零时有一些时髦/不直观的行为.
0m == 0.000m //true
0.1m == 0.1000m //true
Run Code Online (Sandbox Code Playgroud)
但
(0m).ToString() == (0.000m).ToString() //false
(0.1m).ToString() == (0.1000m).ToString() //false
Run Code Online (Sandbox Code Playgroud)
我知道必须遵守ECMA CLI标准.但是我想知道是否有内置的方法来截断十进制值的尾随零而不通过字符串表示(.ToString("G29")和解析后退技巧可行,但既不是快速也不是优雅的解决方案) ?
有任何想法吗?非常感谢.
我有一个十进制值,后面有一个可变位数.,例如:
0.0030
0.0310
0.0001
1.1200
Run Code Online (Sandbox Code Playgroud)
如何编写一个在小数结尾处删除0的动态函数?
从XML文件中我收到格式的小数:
1.132000
6.000000
Run Code Online (Sandbox Code Playgroud)
目前我正在使用Decimal.Parse,如下所示:
decimal myDecimal = Decimal.Parse(node.Element("myElementName").Value, System.Globalization.CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
如何将myDecimal打印到字符串中,如下所示?
1.132
6
Run Code Online (Sandbox Code Playgroud)当我使用json.net向json写小数时,我会遇到恼人的不一致.有时它达到1 dp,有时则达到2 dp.
显然,我知道解决方案,以输出小数的一定数量的小数,如对字符串这个,但是你没有使用json.net无需编写自定义序列我猜控制.
我也知道Math.Round要强制执行最大小数位数,这个问题与强制执行最小小数位数有关.
前两个测试显示正在发生的事情,它保留声明或计算中的原始小数位数.
我发现我可以添加然后减去接下来两个测试显示工作的一小部分,但是有更清洁的方法吗?
[TestFixture]
public sealed class DecimalPlaces
{
public class JsonType
{
public decimal Value { get; set; }
}
[Test]
public void TwoDp()
{
var obj = new JsonType { Value = 1.00m };
Assert.AreEqual("{\"Value\":1.00}", JsonConvert.SerializeObject(obj));
}
[Test]
public void OneDp()
{
var json = new JsonType { Value = 1.0m };
Assert.AreEqual("{\"Value\":1.0}", JsonConvert.SerializeObject(obj));
}
private decimal ForceMinimumDp(decimal p, int minDecimalPlaces)
{
decimal smallFrac = 1m/((decimal)Math.Pow(10, minDecimalPlaces));
return …Run Code Online (Sandbox Code Playgroud) 我刚才知道小数以某种方式记住存储一个数字需要多少trailaing零.换句话说:它记住了分数的大小.
例如:
123M.ToString() ==> resuls in: 123
123.00M.ToString() ==> resuls in: 123.00
123.450M.ToString() ==> resuls in: 123.450
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个格式化字符串或另一个技巧来摆脱那些"不需要的"尾随零,但保持有效数字.所以:
123M.ToString() ==> resuls in: 123
123.00M.ToString() ==> resuls in: 123
123.450M.ToString() ==> resuls in: 123.45
Run Code Online (Sandbox Code Playgroud)
删除新字符串末尾的零对我来说不是一个真正的选择,因为那时我必须找出字符串是否包含一个分数,如果是,还必须删除可选的'.'.或','取决于文化等
我想问一下如何去掉小数点后面的零?
我读过很多有关它的主题,但我不太清楚它们。你能告诉我一些简单的理解方法吗?
例如12.50改为12.5,但实际输出是12.50
我有一种非常紧凑的方法来删除十进制值中的尾随零,但我更喜欢一种不涉及字符串往返的方法,就像我目前所做的那样。这是我当前的解决方案:
var value = 0.010m;
value = decimal.Parse(value.ToString("G29"));
Console.WriteLine(value); // prints 0.01 (not 0.010)
Run Code Online (Sandbox Code Playgroud)
所以它有效,但是你有更好的方法吗?
另外,第二个问题是decimalValue.ToString() 100% 符合xs:decimal?
我有以下价值:
decimal val = 1.100;
Run Code Online (Sandbox Code Playgroud)
现在我想要做的是,如果我在第一个小数点后的值为0,那么我想只取1.1并忽略休息,如果我有1.11那么我想取整个1.11
这就是我的想法:
1)将十进制转换为字符串.
2)逐点拆分.
3)检查长度是否为2,如果第二个位置大于0,则取十进制值11的整数,否则如果十进制像这样1.10然后取1.1否则取小数为1000的1.0
样本输入和输出:
1.000 // output 1.0
1.100 // output 1.1
1.110 // output 1.11
1.111 // output 1.111
1.102 // output 1.102
Run Code Online (Sandbox Code Playgroud)
但这是我想要避免的脏逻辑.有没有内置的方式或更好的方法来做到这一点?
注意:我不想做任何类型的回合.
我有一个使用 EF Core 6 的 ASPNet API 服务器,当我用来WriteAsJsonAsync编写十进制属性时,它会变成:"decimal_property": 0.0000000000000000000000000000。我不想尾随零。
我找到了一些自定义转换的解决方案,但它们都是写在而Newtonsoft不是所以System.Text.Json不能像这样使用
builder.Services.Configure<JsonOptions>(opt =>
{
opt.SerializerOptions.Converters.Add(new DecimalJsonConverter());
}
Run Code Online (Sandbox Code Playgroud)
怎么写一个DecimalJsonConverter可以直接注入的WebApplication?