数字转换

时间:2012-03-21 12:43:45

标签: c++ visual-studio-2010 visual-c++ c++11

在C ++ 11的标题中,有三个用于在数字和字符串之间进行转换的新函数。

std::string std::to_string(unsigned long long);
std::string std::to_string(long double);
std::string std::to_string(long long);

第一个问题 - 为什么只有3个功能?那么简单的int或unsigned int等呢?

第二个问题 - 为什么to_string不会在以下代码中抛出异常?

long double x = std::numeric_limits<long double>::quiet_NaN();
std::string i = std::to_string( x ); 
long double c = std::stold( i ); // i = "1.#QNAN"

第三个问题 - 为什么c等于1.0?

2 个答案:

答案 0 :(得分:5)

  • 只要它产生所描述的行为,请按照自己的意愿行事......

    所有内在数字类型都可以隐式转换为unsigned long longlong doublelong long,并且仍然保持所需的精度,因此不再需要重载。

    标准规定应该定义以下函数,但是确认标准的lib可以自由地执行“任何它想要的”,只要它产生与描述相同的行为。


  • 为什么要抛出异常?

    std::numeric_limits<long double>::quiet_NaN();是一个有效值,标准中描述std::to_string (T)以产生与使用相应的 format-string 调用sprintf相同的行为。

  

§21.5 / 6 数字转换

     
      
  • string to_string(int val);
  •   
  • string to_string(unsigned val);
  •   
  • string to_string(long val);
  •   
  • string to_string(unsigned long val);
  •   
  • string to_string(long long val);
  •   
  • string to_string(unsigned long long val);
  •   
  • string to_string(float val);
  •   
  • string to_string(double val);
  •   
  • string to_string(long double val);

         

    ..

  •   
     

<强>返回:

     
      
  • 每个函数返回一个包含该字符的字符串对象   表示将由其生成的参数的值   使用格式说明符“%d ”,“%u ”调用sprintf(buf,fmt,val),   “%ld ”,“%lu ”,“%lld ”,“%llu ”,“< em>%f “,”%f “或”%Lf “,   其中buf指定足够大小的内部字符缓冲区。
  •   

  • 什么编译器c等于1.0

    如果NaN的值是i的字符串表示形式(不包含任何数字),则转换应生成NaN - 值。

    如果找不到合适的转换,则描述该函数抛出invalid_argument

    尝试将1.#QNAN转换为std::numeric_limits<long double>::quiet_NaN();时,

    MSVC 将产生std::string

    使用std::stold时,它将查找第一个无空白字符,然后使用找到的数字(在这种情况下只有1),因此c将等于函数调用后1.0

答案 1 :(得分:1)

我在标准副本中找到了整个包:

string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);

也许你的编译器还没有实现所有这些呢?

该功能描述为

  

返回:每个函数返回一个字符串对象,其中包含其参数值的字符表示形式,该字符表示形式将通过调用sprintf(buf, fmt, val)格式说明符"%d""%u",{{}}生成。 {1}},"%ld""%lu""%lld""%llu""%f""%f",分别位于"%Lf"指定足够大小的内部字符缓冲区。

因为它应该是buf的包装器,所以可能决定不抛出任何异常,因为sprintf没有。