【问题标题】:How to convert std::wstring to numeric type(int, long, float)?如何将 std::wstring 转换为数字类型(int、long、float)?
【发布时间】:2023-03-12 17:12:01
【问题描述】:

将 std::wstring 转换为数值类型(例如 int、long、float 或 double)的最佳方法是什么?

【问题讨论】:

标签: c++ stl types wstring


【解决方案1】:

C++0x 在<string> 中引入了following functions

int                stoi  (const wstring& str, size_t* idx = 0, int base = 10);
long               stol  (const wstring& str, size_t* idx = 0, int base = 10);
unsigned long      stoul (const wstring& str, size_t* idx = 0, int base = 10);
long long          stoll (const wstring& str, size_t* idx = 0, int base = 10);
unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10);

float       stof (const wstring& str, size_t* idx = 0);
double      stod (const wstring& str, size_t* idx = 0);
long double stold(const wstring& str, size_t* idx = 0);

idx 是一个可选的空指针,指向str 内的转换结束(由转换函数设置)。

【讨论】:

    【解决方案2】:

    要么使用boost::lexical_cast<>

    #include <boost/lexical_cast.hpp>
    
    std::wstring s1(L"123");
    int num = boost::lexical_cast<int>(s1);
    
    std::wstring s2(L"123.5");
    double d = boost::lexical_cast<double>(s2);
    

    如果字符串无法转换,这些将引发boost::bad_lexical_cast 异常。

    另一种选择是使用 Boost Qi(Boost.Spirit 的子库):

    #include <boost/spirit/include/qi.hpp>
    
    std::wstring s1(L"123");
    int num = 0;
    if (boost::spirit::qi::parse(s1.begin(), s1.end(), num))
        ; // conversion successful
    
    std::wstring s2(L"123.5");
    double d = 0;
    if (boost::spirit::qi::parse(s1.begin(), s1.end(), d))
        ; // conversion successful
    

    使用 Qi 比 lexical_cast 快得多,但会增加编译时间。

    【讨论】:

    • 而且人们声称 C++ 过于复杂!
    【解决方案3】:

    最好的?

    如果你不想使用 CRT 库以外的任何东西,并且如果字符串无法转换,并且对得到 0 感到满意,那么你可以节省错误处理、复杂的语法,包括标题

    std::wstring s(L"123.5");
    float value = (float) _wtof( s.c_str() );
    

    这一切都取决于你在做什么。这就是 KISS 方式!

    【讨论】:

    • _wtof 来自哪里?
    • @david c 运行时 (CRT) 库
    • 我在 C99 标准或 Harbison & Steele 中都没有看到对它的引用。也许 wcstod/wcstol/wcstoul 会更好。
    【解决方案4】:

    使用wstringstream / stringstream:

    #include <sstream>
    float toFloat(const std::wstring& strbuf)
    {
        std::wstringstream converter;
        float value = 0;
    
        converter.precision(4);
        converter.fill('0');
        converter.setf( std::ios::fixed, std::ios::floatfield );                              
    
        converter << strbuf;
        converter >> value;
        return value;
    }
    

    【讨论】:

      【解决方案5】:

      只需使用字符串流: 不要忘记#include &lt;sstream&gt;

      wchar_t blank;
      wstring sInt(L"123");
      wstring sFloat(L"123.456");
      wstring sLong(L"1234567890");
      int rInt;
      float rFloat;
      long rLong;
      
      wstringstream convStream;
      
      convStream << sInt<<' '<< sFloat<<' '<<sLong;
      convStream >> rInt;
      convStream >> rFloat;
      convStream >> rLong;
      cout << rInt << endl << rFloat << endl << rLong << endl;
      

      【讨论】:

        【解决方案6】:

        所以我使用的是 Embarcadero,而那块.....并没有让我使用 stoi,所以我必须创建自己的函数。

        int string_int(wstring lala){
            int numero;
            int completo = 0;
            int exponente = 1;
            int l = 1;
            for (int i = 0; i < lala.size(); i++){
                numero = 0;
                for (int j = 48; j < 57; j++){
                    if (lala[i] == j){
                        break;
                    }
                    numero++;
                }
                for (int k = 0; k < lala.size() - l; k++){
                    exponente *= 10;
                }
                numero *= exponente;
                completo += numero;
                exponente = 1;
                l++;
            }
            return completo;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-15
          • 1970-01-01
          • 1970-01-01
          • 2013-02-02
          相关资源
          最近更新 更多