Привет всем!
Возникла проблема преобразования из текстового представления числа в само число, т.е. из "123 456.78" в 123456.78.
При использовании str2num(), any2real() получаем число 123 (ожидалось 123456.78).
Исследование показало следующее:
1. Попытка удалить пробелы из текстового представления числа (разделитель тысячных) ни к чему не приводит, т.к. там на самом деле стоит символ с кодом 160. Этот символ (пробел с кодом 160) берется из региональных настроек для Российского стандарта панели управления. Это стандартно для любого виндоуса.
2. Текстовое представлене числа изначально в Аксапте формируется с помощью функции strfmt("%1", число). При этом код символа разделителя тысячных = 32 (обычный пробел).
3. Текстовое представлене с помощью num2str() дает тот же результат (код символа разделителя тысячных = 32).
Таким образом вопрос сводится к следующему:
почему при преобразовании из числа в строку в качестве разделителя тысячных Аксапта вставляет пробел (код = 32), а не символ из панели управления (код = 160)?
Тестовый джоб:
X++:
static void Test_ConvertStr2num(Args _args)
{
amount a, b;
int asciiCode;
str s, separator, thousandsSeparator;
boolean result;
;
thousandsSeparator = WinApi::getUserLocaleThousandSeparator_RU();
asciiCode = char2num(thousandsSeparator, 1); // 160
result = thousandsSeparator == " "; // false
a = 123456.78;
s = num2str(a, 10, 2, -1, -1); // "123 456.78"
separator = substr(s, 4, 1); // вытащить разделитель
asciiCode = char2num(separator, 1); // 32
result = thousandsSeparator == separator; // false
result = separator == " "; // true
s = strfmt("%1", a); // "123 456.78"
b = any2real(s); // 123
b = str2num(s); // 123
separator = substr(s, 4, 1); // вытащить разделитель
asciiCode = char2num(separator, 1); // 32
s = strrem(s, thousandsSeparator); // ничего не происходит
b = str2num(s); // 123
b = any2real(s); // 123
b = b;
}