2015-04-05 1 views
0

Я пытаюсь сделать свою программу более совместимой, для этого я, в конечном итоге, меняю много мелочей, например,Обработка десятичных разделителей (запятая и точка) для целой программы с несколькими строками кода

Использование textBox.Text = Convert.ToString(value) вместо = "value"

Получение текущего пользователя десятичного разделителя и использовать его replace на tryparse

char sepdec = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 

float.TryParse(str.Replace(",", sepdec.ToString()).Replace(".", sepdec.ToString()), out testvariable; 

Но эти решения трудно реализовать, если у вас есть уже треска большинство вашей программы, не беспокоясь об этом.

Так что я пытаюсь найти способы, чтобы сделать весь код совместимым, без необходимости редактировать каждый tryparse и каждый textbox

я попытался сделать следующее:

//Get the current user decimal separator before the program initializes 
char sepdec = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 

//Create a current culture clone and change the separator to whatever the user has in his regional options, before the initializing the component 

    public Form1() 
    { 
    System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone(); 
    customCulture.NumberFormat.NumberDecimalSeparator = sepdec.ToString(); 

    System.Threading.Thread.CurrentThread.CurrentCulture = customCulture; 

    InitializeComponent(); 
    } 

Но я «Я проверил это, и он ничего не делает. Разве не предполагалось, что программа понимает что-то вроде ok, now you use dot as your decimal separator altough you have values in textBox as "2,5"?

ответ

1

ОК, теперь вы используете точку в качестве десятичного разделителя Altough у вас есть значения в TextBox как "2,5"

Ровно.

float.TryParse метод использует ваши настройки CurrentCulture, если вы не используете IFormatProvider.

При попытке разобрать "2,5" плавать без IFormatProvider, ваш CurrentCulture должен иметь , как NumberDecimalSeparator.

Если вы попытаетесь разобрать "2.5" для плавания, вы либо используете культуру как еще один параметр, который уже имеет. как NumberDecimalSeparator (как InvariantCulture), или вы можете .Clone() ваш CurrentCulture (как вы сделали) и установить его NumberDecimalSeparator свойства . и использовать эту клонированную культуру в качестве другого параметра в float.TryParse overload.

+0

Я думаю, что не правильно объяснил, потому что он не работает. Когда я говорю «ОК», теперь вы используете точку в качестве разделителя десятичных чисел, хотя у вас есть значения в текстовом поле как «2,5». «Я имею в виду, что теперь вы будете обрабатывать« 2,5 »как« 2,5 »(с точкой) , и попробуйте его правильно ». – ng80092b

+0

Кроме того, я могу ошибаться, но это может быть проблемой. Когда я говорю 'System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;' Не должен ли каждый 'tryparse' в коде использовать эту обычную культуру? Потому что, если мне нужно использовать 'currentculture' в качестве аргумента, это победит цель избежать редактирования каждого' tryparse' – ng80092b

+0

@ ng80092b № Культура _can't_ рассматривать '2,5' как' 2.5' или наоборот. Поплавок может иметь различное представление в виде строки, основанной на настройках культуры. Это то же самое, что и при попытке разбора строки для float. Строка должна содержать точные разделители, используемые в текущей культуре для синтаксического анализа. –