Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: String Format of C# in C++

  1. #1
    Ngày gia nhập
    01 2008
    Bài viết
    18

    Talking String Format of C# in C++

    Lâu rùi mới lên diễn đàn, hôm nay đóng góp thêm một cái tool be bé về string cho mọi người ...

    Chắc các bạn cũng biết về string format bên C#, nó rất đẹp và dễ hiểu:

    Ví dụ:
    Visual C# Code:
    1. Console.WriteLine("Hello {0} and bye {1}\n", "vpdp_pc", 15.000124);
    2. -> Hello vpdp_pc and bye 15.000124

    So với C++:
    C++ Code:
    1. cout << "Hello " << "vpdp_pc" << "and bye " << 15.000124 << endl;
    2. -> Hello vpdp_pc and bye 15.000124

    Cả hai cách đều khá dễ hiểu nhưng mình thích cách của C# hơn vì nhìn trong sáng và dễ hiểu hơn. Và vì mình làm việc nhiều trên C++ nên mình mới viết một tool nho nhỏ dùng để format string giống như C#.

    Code example:
    C++ Code:
    1. #define _STRFORMAT_MAXPARAMS 3
    2. #include "StrFormat.h"
    3.  
    4. string userIn = "";
    5. char tmp[256];
    6. cin.getLine(tmp,255);
    7. userIn = tmp;
    8.  
    9. cout << _strFormat("Hello {{1}} {0} {1} bye {2}\n", userIn, "and", 2.00001f);
    10.  
    11. -> Hello {1} *userIn* and bye 2.00001

    Một số lưu ý:
    + Trước khi include StrFormat.h bạn nên define _STRFORMAT_MAXPARAMS là số parameters tối đa khi sử dụng _strFormat(). Với ví dụ trên nếu bạn define _STRFORMAT_MAXPARAMS 1 thì khi dịch sẽ bị lỗi. Mục đích của _STRFORMAT_MAXPARAMS là nhằm giảm thiểu số lượng code không cần thiết trong StrFormat.h, nếu bạn không define _STRFORMAT_MAXPARAMS thì mặc định số parameter tối đa là 10

    + Nếu bạn muốn in ra kí tự '{' thì trong param đầu tiên bạn phải sử dụng "{{", giống như ví dụ trên

    File StrFormat.h (do không dài lắm nên post code lên đây luônn, các bạn muốn sử dụng thì chỉ cần copy & paste vô file tên StrFormat.h) :
    C++ Code:
    1. #ifndef _STRFORMAT_H_
    2. #define _STRFORMAT_H_
    3.  
    4. #include <string>
    5. #include <vector>
    6. #include <sstream>
    7.  
    8. #ifndef _STRFORMAT_MAXPARAMS
    9. #define _STRFORMAT_MAXPARAMS 10
    10. #endif
    11.  
    12. template<typename T, typename S>
    13. T _cast(S s)
    14. {
    15.     std::stringstream ss;
    16.     ss << s;
    17.     T res;
    18.     ss >> res;
    19.     return res;
    20. }
    21.  
    22. struct _strFormat_box
    23. {
    24. private:
    25.     std::string _str;
    26.  
    27. public:
    28.     _strFormat_box()
    29.     {}
    30.  
    31.     std::string toString()
    32.     {
    33.         return _str;
    34.     }
    35.  
    36.     _strFormat_box(int iValue)
    37.     {
    38.         _str = _cast<std::string>(iValue);
    39.     }
    40.     _strFormat_box(long lValue)
    41.     {
    42.         _str = _cast<std::string>(lValue);
    43.     }
    44.     _strFormat_box(float fValue)
    45.     {
    46.         _str = _cast<std::string>(fValue);
    47.     }
    48.     _strFormat_box(const double &dValue)
    49.     {
    50.         _str = _cast<std::string>(dValue);
    51.     }
    52.     _strFormat_box(const long long &llValue)
    53.     {
    54.         _str = _cast<std::string>(llValue);
    55.     }
    56.     _strFormat_box(unsigned int uiValue)
    57.     {
    58.         _str = _cast<std::string>(uiValue);
    59.     }
    60.     _strFormat_box(unsigned long ulValue)
    61.     {
    62.         _str = _cast<std::string>(ulValue);
    63.     }
    64.     _strFormat_box(short shValue)
    65.     {
    66.         _str = _cast<std::string>(shValue);
    67.     }
    68.     _strFormat_box(char cValue)
    69.     {
    70.         _str = _cast<std::string>(cValue);
    71.     }
    72.     _strFormat_box(unsigned char ucValue)
    73.     {
    74.         _str = _cast<std::string>(ucValue);
    75.     }
    76.     _strFormat_box(const char *ccValue)
    77.     {
    78.         _str = _cast<std::string>(ccValue);
    79.     }
    80.     _strFormat_box(char *cptrValue)
    81.     {
    82.         _str = _cast<std::string>(cptrValue);
    83.     }
    84.     _strFormat_box(const std::string &strValue)
    85.     {
    86.         _str = strValue;
    87.     }
    88. };
    89.  
    90. std::string _strFormat_private(const char *fmt, std::vector<_strFormat_box> vb)
    91. {
    92.     std::string ret(fmt);
    93.  
    94.     for (int i = 0; i < int(vb.size()); i++)
    95.     {
    96.         std::string tmp = "{";
    97.         tmp.append(_cast<std::string>(i));
    98.         tmp.append("}");
    99.         int len = int(tmp.size());
    100.  
    101.         std::string::size_type position = -1;
    102.         do
    103.         {
    104.             if (position == -1)
    105.                 position = ret.find(tmp);
    106.             else
    107.                 position = ret.find(tmp, position + 1);
    108.  
    109.             if (position == std::string::npos)
    110.                 break;
    111.  
    112.             if (position > 0)
    113.             {
    114.                 if (ret[position - 1] == '{')
    115.                     continue;
    116.             }
    117.             if (position < (ret.size() - 1) )
    118.             {
    119.                 if (ret[position + 1] == '}')
    120.                     continue;
    121.             }
    122.  
    123.             ret.replace(position, len, vb[i].toString());
    124.         }
    125.         while (position != std::string::npos);
    126.     }
    127.  
    128.     //check for {{ and }}
    129.     for (int i = 1; i < int(ret.size()); i++)
    130.     {
    131.         if (ret[i] == '{' && ret[i - 1] == '{')
    132.             ret.replace(i - 1, 2, "{");
    133.         if (ret[i] == '}' && ret[i - 1] == '}')
    134.             ret.replace(i - 1, 2, "}");
    135.     }
    136.  
    137.     return ret;
    138. }
    139.  
    140. #if _STRFORMAT_MAXPARAMS >= 1
    141. std::string _strFormat(const char *fmt, _strFormat_box b0)
    142. {
    143.     std::vector<_strFormat_box> vb(1);
    144.     vb[0] = b0;
    145.  
    146.     return _strFormat_private(fmt,vb);
    147. }
    148. #endif
    149.  
    150. #if _STRFORMAT_MAXPARAMS >= 2
    151. std::string _strFormat(const char *fmt, _strFormat_box b0,
    152.                        _strFormat_box b1)
    153. {
    154.     std::vector<_strFormat_box> vb(2);
    155.     vb[0] = b0;
    156.     vb[1] = b1;
    157.  
    158.     return _strFormat_private(fmt,vb);
    159. }
    160. #endif
    161.  
    162. #if _STRFORMAT_MAXPARAMS >= 3
    163. std::string _strFormat(const char *fmt, _strFormat_box b0,
    164.                        _strFormat_box b1, _strFormat_box b2)
    165. {
    166.     std::vector<_strFormat_box> vb(3);
    167.     vb[0] = b0; vb[1] = b1; vb[2] = b2;
    168.  
    169.     return _strFormat_private(fmt,vb);
    170. }
    171. #endif
    172.  
    173. #if _STRFORMAT_MAXPARAMS >= 4
    174. std::string _strFormat(const char *fmt, _strFormat_box b0,
    175.                        _strFormat_box b1, _strFormat_box b2,
    176.                        _strFormat_box b3)
    177. {
    178.     std::vector<_strFormat_box> vb(4);
    179.     vb[0] = b0; vb[1] = b1; vb[2] = b2;
    180.     vb[3] = b3;
    181.  
    182.     return _strFormat_private(fmt,vb);
    183. }
    184. #endif
    185.  
    186. #if _STRFORMAT_MAXPARAMS >= 5
    187. std::string _strFormat(const char *fmt, _strFormat_box b0,
    188.                        _strFormat_box b1, _strFormat_box b2,
    189.                        _strFormat_box b3, _strFormat_box b4)
    190. {
    191.     std::vector<_strFormat_box> vb(5);
    192.     vb[0] = b0; vb[1] = b1; vb[2] = b2;
    193.     vb[3] = b3; vb[4] = b4;
    194.  
    195.     return _strFormat_private(fmt,vb);
    196. }
    197. #endif
    198.  
    199. #if _STRFORMAT_MAXPARAMS >= 6
    200. std::string _strFormat(const char *fmt, _strFormat_box b0,
    201.                        _strFormat_box b1, _strFormat_box b2,
    202.                        _strFormat_box b3, _strFormat_box b4,
    203.                        _strFormat_box b5)
    204. {
    205.     std::vector<_strFormat_box> vb(6);
    206.     vb[0] = b0; vb[1] = b1; vb[2] = b2;
    207.     vb[3] = b3; vb[4] = b4; vb[5] = b5;
    208.  
    209.     return _strFormat_private(fmt,vb);
    210. }
    211. #endif
    212.  
    213. #if _STRFORMAT_MAXPARAMS >= 7
    214. std::string _strFormat(const char *fmt, _strFormat_box b0,
    215.                        _strFormat_box b1, _strFormat_box b2,
    216.                        _strFormat_box b3, _strFormat_box b4,
    217.                        _strFormat_box b5, _strFormat_box b6)
    218. {
    219.     std::vector<_strFormat_box> vb(7);
    220.     vb[0] = b0; vb[1] = b1; vb[2] = b2;
    221.     vb[3] = b3; vb[4] = b4; vb[5] = b5;
    222.     vb[6] = b6;
    223.  
    224.     return _strFormat_private(fmt,vb);
    225. }
    226. #endif
    227.  
    228. #if _STRFORMAT_MAXPARAMS >= 8
    229. std::string _strFormat(const char *fmt, _strFormat_box b0,
    230.                        _strFormat_box b1, _strFormat_box b2,
    231.                        _strFormat_box b3, _strFormat_box b4,
    232.                        _strFormat_box b5, _strFormat_box b6,
    233.                        _strFormat_box b7)
    234. {
    235.     std::vector<_strFormat_box> vb(8);
    236.     vb[0] = b0; vb[1] = b1; vb[2] = b2;
    237.     vb[3] = b3; vb[4] = b4; vb[5] = b5;
    238.     vb[6] = b6; vb[7] = b7;
    239.  
    240.     return _strFormat_private(fmt,vb);
    241. }
    242. #endif
    243.  
    244. #if _STRFORMAT_MAXPARAMS >= 9
    245. std::string _strFormat(const char *fmt, _strFormat_box b0,
    246.                        _strFormat_box b1, _strFormat_box b2,
    247.                        _strFormat_box b3, _strFormat_box b4,
    248.                        _strFormat_box b5, _strFormat_box b6,
    249.                        _strFormat_box b7, _strFormat_box b8)
    250. {
    251.     std::vector<_strFormat_box> vb(9);
    252.     vb[0] = b0; vb[1] = b1; vb[2] = b2;
    253.     vb[3] = b3; vb[4] = b4; vb[5] = b5;
    254.     vb[6] = b6; vb[7] = b7; vb[8] = b8;
    255.  
    256.     return _strFormat_private(fmt,vb);
    257. }
    258. #endif
    259.  
    260. #if _STRFORMAT_MAXPARAMS >= 10
    261. std::string _strFormat(const char *fmt, _strFormat_box b0,
    262.                        _strFormat_box b1, _strFormat_box b2,
    263.                        _strFormat_box b3, _strFormat_box b4,
    264.                        _strFormat_box b5, _strFormat_box b6,
    265.                        _strFormat_box b7, _strFormat_box b8,
    266.                        _strFormat_box b9)
    267. {
    268.     std::vector<_strFormat_box> vb(10);
    269.     vb[0] = b0; vb[1] = b1; vb[2] = b2;
    270.     vb[3] = b3; vb[4] = b4; vb[5] = b5;
    271.     vb[6] = b6; vb[7] = b7; vb[8] = b8;
    272.     vb[9] = b9;
    273.  
    274.     return _strFormat_private(fmt,vb);
    275. }
    276. #endif
    277.  
    278. #endif //_STRFORMAT_H_

    Về phần StrFormat.h, nếu bạn nào quan tâm làm như thế nào thì có thể xem qua nó và phần tham khảo. Trong đó cũng có hàm _cast<T>(value) là một hàm chuyển kiểu khá cơ bản của C++, các bạn có thể xem qua

    Khuyết Điểm:
    + Không hỗ trợ Unicode
    + Hình như chạy hơi chậm

    Tham Khảo:
    +http://www.codeproject.com/KB/string...matNative.aspx

    Trong phần tham khảo giải thích khá chi tiết về cách làm, mình chỉ code lại cho ngắn gọn nên không hỗ trợ Unicode (code của phần tham khảo rất dài gần 40Kb trong khi code của mình chỉ có 7Kb ).
    Bài của mình so với bài tham khảo có khác nhau khá nhiều nhưng cơ bản ý tưởng giống nhau nên các bạn có thể đọc code của mình và góp ý để hoàn thiện hơn.

    Luôn mong những góp ý từ các bạn . Chúc vui ! (bắt chước admin )
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Cái code này Dr thấy hấp dẫn đó. Thank you for your sharing!
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Các đề tài tương tự

  1. [ Lỗi ] Input string was not in a correct format
    Gửi bởi NguyenDuyPC trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 6
    Bài viết cuối: 29-06-2013, 04:16 PM
  2. Lổi input string was not in a correct format
    Gửi bởi vankinh1984 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 5
    Bài viết cuối: 14-05-2013, 04:37 PM
  3. Format string
    Gửi bởi phehuyet trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 10-08-2009, 10:13 AM
  4. Cần giúp 1 đoạn format string.
    Gửi bởi abetterday trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 21-03-2009, 12:55 PM
  5. DateTime Format? How to fix value when format string don't contains year
    Gửi bởi zxc trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 25-08-2008, 11:19 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn