双值变为相反(0.5变为5)

时间:2015-03-19 17:08:06

标签: c#

好的,我在这里真的很奇怪。

当我给ingaveBox一个双精度值(0.5)并按"bereken"时,它会向我的gespaard变量添加5.0。我完全不知道这是怎么发生的。我知道某处出现了一个小错误,但是当我从评论的那一刻开始调试价值变化时,我无法理解它。

提前致谢!

public partial class MainWindow : Window
{
    private string path = @"C:\Users\Ragtox\Documents\Spaarpot\Spaarpot\gespaard.txt";
    private double vorigGespaard;
    private double toegevoegd;
    private double gespaard;

    public MainWindow()
    {
        InitializeComponent();
        ReadList();
    }

    void WriteList()
    {
        string[] createText = {gespaard.ToString()};
        File.WriteAllLines(path, createText);
    }

    void ReadList()
    {
        string[] readText = File.ReadAllLines(path);
        vorigGespaard = Convert.ToDouble(readText[0]);
        vorigeBedragBox.Text = readText[0];
    }

    private void berekenButton_Click(object sender, RoutedEventArgs e)
    {
        vorigeBedragBox.Text = vorigGespaard.ToString();
        gespaard = Convert.ToDouble(ingaveBox.Text) + vorigGespaard;
        //this is where 0.5 goes to 5.0
        gespaardBox.Text = gespaard.ToString();
        WriteList();
        ReadList();
    }

    private void saveButton_Click(object sender, RoutedEventArgs e)
    {
        WriteList();
    }
}

1 个答案:

答案 0 :(得分:0)

正如所说的那样,这个问题很可能源于您的机器正在运行的CultureInfo。一般来说,您应该始终持续存在并在invariant culture以便可以使用其他语言成功读取以一种语言保存的值。

否则,如果说巴西葡萄牙语(language code pt-br)用户保存了值"123,456"(这是一百二十三和四十五万六千分之一)以葡萄牙文表示,用户阅读,例如,英国英语(语言代码en-gb)会将其解释为123个,446个(即a因数千人。)


我修改了您的代码,使用Double.ToString(CultureInfo.CurrentCulture)Double.TryParse将值保存在不变文化中。

void WriteList()
{
    // save in invariant culture
    string[] createText = {gespaard.ToString(CultureInfo.CurrentCulture)};
    File.WriteAllLines(path, createText);
}

void ReadList()
{
    string[] readText = File.ReadAllLines(path);

    // read from invariant culture
    bool parsed = double.TryParse(readText[0], NumberStyles.Any, CultureInfo.InvariantCulture, out vorigGespaard);
    if ( !parsed )
        throw new InvalidOperationException("Unable to parse " + readText[0] + " as a double");

    // use the current culture to display the string
    vorigeBedragBox.Text = vorigGespaard.ToString();
}

private void berekenButton_Click(object sender, RoutedEventArgs e)
{
    vorigeBedragBox.Text = vorigGespaard.ToString();

    // get the value from its representation in the current culture
    gespaard = double.Parse(ingaveBox.Text) + vorigGespaard;

    // use the current culture to display the string
    gespaardBox.Text = gespaard.ToString();

    WriteList();
    ReadList();
}

与我在日历被假定为Gregorian时看到的真正问题相比,这是一个小小的不便 - 当我尝试将文化设置为 th时,这个问题就破了(泰语) - 他们使用的是Buddhist calendar,距今还有543年。它是该日历中的2558年 - 正如您所想象的那样,未将日期转换为UTC会导致一些问题......