好的,我在这里真的很奇怪。
当我给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();
}
}
答案 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会导致一些问题......