如何在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

当然,我可以用逗号分割,然后把它放到数组中,但我想知道是否有更好的方法

如何在c#中将字符串转换为小数[]

你必须去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#编译器还没有向导