MFC Visual C++中是否存在将CString格式化为货币格式的类或方法?
MFC Visual C++ 货币格式化实现方案
核心问题解决:字符串转数值截断
你遇到的CString转double截断问题,是因为默认数值转换函数(如_tcstod)会把逗号视为非数字字符,只读取逗号前的部分。解决办法是先统一分隔符:将输入字符串中的逗号替换为点,再执行转换。
两种可行的格式化方法
1. 使用MFC自带的COleCurrency类
COleCurrency是MFC专门用于货币处理的类,支持数值存储与格式化输出,步骤如下:
// 示例1:处理输入字符串"12345,67" CString strInput = _T("12345,67"); // 替换逗号为点,确保转换为正确的double值 strInput.Replace(_T(","), _T(".")); double dValue = _tcstod(strInput, nullptr); // 初始化COleCurrency对象 COleCurrency currency(dValue); CString strFormatted; // 格式化带千分位与两位小数 currency.Format(_T("#,##0.00")); // 手动调整分隔符为欧洲格式(点作千分位,逗号作小数位) strFormatted.Replace(_T(","), _T("temp")); strFormatted.Replace(_T("."), _T(",")); strFormatted.Replace(_T("temp"), _T(".")); // 最终strFormatted为"12.345,67"
// 示例2:处理整数输入"5000" CString strInput = _T("5000"); double dValue = _tcstod(strInput, nullptr); COleCurrency currency(dValue); CString strFormatted; currency.Format(_T("#,##0.00")); // 替换分隔符 strFormatted.Replace(_T(","), _T("temp")); strFormatted.Replace(_T("."), _T(",")); strFormatted.Replace(_T("temp"), _T(".")); // 最终strFormatted为"5.000,00"
2. 使用Windows API GetNumberFormat
这个API可以自定义分隔符,无需依赖系统区域设置,灵活性更高:
CString strInput = _T("12345,67"); strInput.Replace(_T(","), _T(".")); double dValue = _tcstod(strInput, nullptr); // 定义格式化规则 NUMBERFMT nf = {0}; nf.NumDigits = 2; // 保留两位小数 nf.LeadingZero = 1; // 小数位补零 nf.Grouping = 3; // 每3位添加千分位 nf.lpDecimalSep = _T(","); // 小数分隔符为逗号 nf.lpThousandSep = _T(".");// 千分位分隔符为点 nf.NegativeOrder = 0; TCHAR szNumBuffer[256]; _stprintf_s(szNumBuffer, _T("%.2f"), dValue); TCHAR szFormatted[256]; GetNumberFormat(LOCALE_USER_DEFAULT, 0, szNumBuffer, &nf, szFormatted, 256); CString strFormatted(szFormatted); // 直接得到"12.345,67"或"5.000,00"
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

