2016-10-06 3 views
0

Если мы получим значение из поля редактирования как Marathi '1.2', тогда я хочу, чтобы это значение равно 1.2 в формате float, я попытался _wtof(), но он не смог его вернуть только 0. Его работа такая же, как _wtoi(). Все нормально, но -_wtof()? Пожалуйста, предложите что-нибудь другое.Преобразование шрифтов Marathi (неарабских) чисел в арабские числа

+1

Вы можете разобрать строку самостоятельно, я думаю. Или, если есть соответствие от 1 до 1 символов, просто преобразуйте строковые символы в цифры в другую строку, а затем проанализируйте их с помощью atof. –

+0

Я предполагаю, что «1.2» - это числа, написанные в сценарии маратхи? – sashoalm

+0

Thanx Adrian Да, я разбирал его, но я думаю, что это стандартная проблема, поэтому задаю любой api для преобразования unicode cstring в значение float –

ответ

1

На самом деле std::stof и std::stod прекрасно работают в Visual Studio 2015

#include <iostream> 
#include <string> 

double convert(const std::wstring src) 
{ 
    double f = 0; 
    try { 
     f = std::stod(src); 
    } 
    catch (...) 
    { 
     //error, out of range or invalid string 
    } 

    return f; 
} 

int main() 
{ 
    std::cout << std::setprecision(20); 
    std::cout << convert(L"१२३४५६७८९.१२३४५६७८९") << "\n"; 
    std::cout << convert(L"१.२") << "\n"; 
    return 0; 
} 

Но _wtof не работает. Вы можете использовать эти методы, если есть несовместимость в более ранней версии:

double convert(const std::wstring src) 
{ 
    std::wstring map = L"०१२३४५६७८९"; 

    //convert src to Latin: 
    std::wstring result; 
    for (auto c : src) 
    { 
     int n = map.find(c); 
     if (n >= 0) 
      result += (wchar_t)(n+ (int)(L'0')); 
     else 
      result += c; 
    } 

    double n = 0; 
    try { n = std::stof(result); } 
    catch (...) 
    { 
     std::wcout << L"error" << result << "\n"; 
    } 
    return n; 
} 

int main() 
{ 
    std::cout << convert(L"१.१") << "\n"; 
    std::cout << convert(L"१.२") << "\n"; 
    return 0; 
} 

или с помощью CString:

double convert(const CString src) 
{ 
    CString map = L"०१२३४५६७८९"; 

    //convert src to Latin: 
    CString result; 
    for (int i = 0; i < src.GetLength(); i++) 
    { 
     int n = map.Find(src[i]); 
     if (n >= 0) 
      result += (wchar_t)(n + (int)(L'0')); 
     else 
      result += src[i]; 
    } 

    return _wtof(result.GetString()); 
}