字串:怎樣轉換字串為數字型別? (轉)

worldblog發表於2007-12-14
字串:怎樣轉換字串為數字型別? (轉)[@more@]

字串:怎樣轉換字串為數字型別?


當將字串轉換為數值型別時, 有一項東西你不允許忽略:
轉換可能因為你正在轉換的字串可能不包含有效的數字表示法而失敗

例如, 如果你想將"Hello"轉換為數字, 轉換將失敗

老的C方法(不贊成)

許多人用atoi(), atof() 和這個“家族”中的其它. 它們方便應用,但是有一個重要的缺點:
在轉換失敗和轉換字串"0"時都返回0, 這樣使得一致性錯誤檢查變得幾乎不可能。 為了完整性我們給出了小段程式碼:

 

程式碼:
--------------------------------------------------------------------------------
  const char* str_int = "777";
  const char* str_float = "333.3";
  int i = atoi(str_int);
  float f = atof(str_float);
--------------------------------------------------------------------------------


一個更好的辦法:

更有一點複雜, 更遺一致的辦法是利用sscanf()

程式碼:
--------------------------------------------------------------------------------
  const char* str_int = "777";
  const char* str_float = "333.3";
  int i;
  float f;
  if(EOF == sscanf(str_int, "%d", &i)){
  //錯誤
  }
  if(EOF == sscanf(str_float, "%f", &f)){
  //錯誤
  }
--------------------------------------------------------------------------------

Since sscanf() takes a const char* parameter, you can directly use a CString with it:
因為sscanf()用const char* 作為引數, 所以你可以直接用CString作引數:

程式碼:
--------------------------------------------------------------------------------
  CString str_int("777");
  if(EOF == sscanf(str_int, "%d", &i)){
  //error
  }
--------------------------------------------------------------------------------

小心格式描述符(如本例中的"%d")。 sscanf()沒有辦法檢查格式描述符與傳遞變數的型別匹配與否。如果不匹配你將得到不可預期的結果。 同樣注意sscanf()可以一次從字串中提取一個或多個數值。 詳細資訊請查閱MSDN。

 

C++ 方法


如下的例子展示了利用標準C++類的來完成這個任務的模板函式

程式碼:
--------------------------------------------------------------------------------
#include
#include
#include

template
bool from_string(T &t,
  const std::string &s,
  std::ios_base & (*f)(std::ios_base&))
{
  std::istringstream iss(s);
  return !(iss>>f>>t).fail();
}

int main()
{
  int i;
  float f;
  // from_string()的第三個引數應為如下中的一個
  // one of std::hex, std::dec 或 std::oct
  if(from_string(i, std::string("ff"), std::hex)){
  std::cout<  }
  else{
  std::cout<  }
  if(from_string(f,
  std::string("123.456"),
  std::dec))
  {
  std::cout<  }
  else{
  std::cout<  }
  return 0;
}

/* 輸出:
255
123.456
*/
--------------------------------------------------------------------------------

這個方法不僅僅非常別緻, 而且也是型別的, 因為在編譯時會根據運算元的型別將挑選適當的std::istringstream ::operator >>()。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993440/,如需轉載,請註明出處,否則將追究法律責任。

相關文章