如何在c#中将字符串转换为小数[]
本文关键字:转换 小数 字符串 | 更新日期: 2023-09-27 18:13:23
有办法做到这一点吗?
我试着:
string str = "{34.10,0,0.00}"; //the string as I get it from Postgres DB
decimal[] won;
won = (decimal[])(str); //Cannot convert type 'string' to 'decimal[]'
我最理想的是进入won
:
won[0] = 34.10
won[1] = 0
won[2] = 0.00
当然,我可以用逗号分割,然后把它放到数组中,但我想知道是否有更好的方法
你必须去Split
won = str.Trim('{', '}').Split(',').Select(decimal.Parse).ToArray();
编辑:这部分只是为了好玩
没有办法将字符串直接转换为decimal[]
数组,但如果你想,你可以添加一个十进制包装器类并定义隐式转换:
class MyDecimal
{
private decimal[] _values;
public MyDecimal(int size)
{
_values = new decimal[size];
}
public decimal this[int index]
{
get { return _values[index]; }
set { _values[index] = value; }
}
public static implicit operator MyDecimal(string str)
{
var numbers = str.Trim('{', '}').Split(',');
MyDecimal d = new MyDecimal(numbers.Length);
d._values = numbers
.Select(x => decimal.Parse(x,CultureInfo.InvariantCulture))
.ToArray();
return d;
}
public static implicit operator string(MyDecimal md)
{
return string.Join(",", md._values);
}
}
那么你可以这样做:
string str = "{34.10,0,0.00}"; //the string as I get it from Postgres DB
MyDecimal won = str;
我首先误解了你的问题。真正的答案是:我知道除了在循环中分割和转换或使用LINQ (LINQ示例见Selman22的答案)之外没有其他方法。没有办法一次性将字符串转换为数组。
虽然这基本上是你的建议,你可以试试这个:
// Remove leading and trailing brackets
string s = str.Trim('{', '}');
// Split numbers
string[] parts = s.Split(',');
decimal[] nums = new decimal[parts.Length];
// Convert
for (int i = 0; i < parts.Length; i++)
nums[i] = Convert.ToDecimal(parts[i]);
对那些说你别无选择只能分裂的人唱反调:
var result = new JavaScriptSerializer()
.Deserialize<decimal[]>(str.Replace('{', '[').Replace('}', ']'))
这里有另一种方法,但可能不是更好的方法
string str = "{34.10,0,0.00}";
string pattern = @"(['d]+['.]|['d]?)['d]+";
decimal[] result = Regex.Matches(str, pattern, RegexOptions.None)
.Cast<Match>()
.Select(x => decimal.Parse(x.Value))
.ToArray();
但是请记住Jamie Zawinski:
另一种方法是使用StringReader并管理分割当遇到问题时,有些人会想"我知道,我会用正则表达式。"现在他们有两个问题。
没有更好的办法了。至少在c#被人工智能支持之前,人工智能会通过自定义逻辑将一种数据类型转换为另一种数据类型,从而猜测你想要做什么。
任何程序员都会猜到你想要什么。到目前为止,c#编译器还没有向导