Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Алексей Терно от 10-04-2016, 13:53:11

Название: Знак разделения дробной части
Отправлено: Алексей Терно от 10-04-2016, 13:53:11
Появилась нужда определить знак разделения дробной части, установленный в операционной системе. В принципе сделать это не проблема:
Код - C# [Выбрать]
  1. NumberFormatInfo numberFormatInfo;
  2. string decimalSeparator;
  3.  
  4. numberFormatInfo = CultureInfo.CurrentCulture.NumberFormat;
  5. decimalSeparator = numberFormatInfo.NumberDecimalSeparator;

А проблема возникает при вызове этого кода из C3D (в обычном Автокаде не проверял, у меня его нет) - вместо "," он выдает ".". Я даже делал "чистую" проверку - создал отдельную DLL, которая как раз и выводит значение знака разделителя. При подключении этой DLL в какой-нибудь экзешник получаю ожидаемую ",", а вот при подключении этой же DLL в приложение, вызываемое из C3D - получаю неведомую ".". Во время отладки вижу имя "ru-RU" и все знаки разделения дробной части - точки, вместо запятых, которые установлены у меня в системе.
Название: Re: Знак разделения дробной части
Отправлено: Александр Ривилис от 10-04-2016, 13:56:06
Так и должно быть. AutoCAD подменяет это значение для того, чтобы правильно (в своём понимании) выводить дробные числа.
Название: Re: Знак разделения дробной части
Отправлено: Алексей Терно от 10-04-2016, 13:58:42
А как тогда из Автокада получить настоящий знак, установленный в системе?
Название: Re: Знак разделения дробной части
Отправлено: Алексей Терно от 10-04-2016, 14:37:04
Есть контакт!
Получилось двумя способами:
1. просто использовать CurrentUICulture, вместо CurrentCulture
2. создать новый экземпляр CurrentCulture:
Код - C# [Выбрать]
  1. CultureInfo currentci = CultureInfo.CurrentCulture;
  2. CultureInfo myci = CultureInfo.CreateSpecificCulture(currentci.Name);
Название: Re: Знак разделения дробной части
Отправлено: Александр Ривилис от 10-04-2016, 20:29:50
Еще один вариант для получения разделителя целой и дробной части на уровне пользователя: прочитать из реестра HKEY_CURRENT_USER\Control Panel\International значение sDecimal.
Код - C# [Выбрать]
  1. string delim = (string)Microsoft.Win32.Registry.GetValue("HKEY_CURRENT_USER\\Control Panel\\International", "sDecimal", ",");