属性 • 方法 • 事件 • 类型 • 数据 • 返回 AnsiStringBase 类
类型 |
描述 |
public: |
|
TStringFloatFormat |
enum TStringFloatFormat { sffGeneral, sffExponent, sffFixed, sffNumber, sffCurrency };
这个枚举类型提供给 FloatToStrF 和 CurrToStrF 方法使用。
sffGeneral |
常用的格式。使用定点数或科学计数法,尽可能的生成更短的字符串,去掉小数末尾的 0,仅在必须有的时候才包含小数点。
小数点左面的位数,小于等于要求的精度位数,并且大于 0.00001 的数,会使用定点数方式输出,否则会使用科学计数法。 |
sffExponent |
科学计数法。转换之后的字符串的格式为 "-d.dddE+dddd"
如果是负数,开始字符为减号 “-”,小数点的前面始终有 1 位数,总位数为参数给定的位数。
字符 “E” 的后面始终跟着加号 “+” 或减号 “-”,最后是指数。 |
sffFixed |
定点数。转换之后的字符串的格式为 "-ddd.ddd"
如果是负数,开始字符为减号 “-”,小数点的前面至少有 1 位。
小数点之后的位数为转换函数的参数 digits 给定的值,必须在 0 ~ 18
之间。
如果小数点前面的位数超出了参数给定的精度位数 (超出定点数可以表达的能力),会使用科学计数法。 |
sffNumber |
带千位分隔符的定点数。转换之后的格式为 "-d,ddd,ddd.ddd"
规则与 sffFixed 相同,并且在这个基础上,增加千位分隔符。 |
sffCurrency |
货币格式,用于表示金额值。
格式受 CurrencyString, CurrencyFormat, NegCurrFormat, ThousandSeparator, DecimalSeparator 这几个全局变量的控制,默认的,这些全局变量初始化为 Windows 控制面板里面的地区选项里面的货币格式。小数点后面的位数由转换函数的参数 digits 参数给定,范围在 0 ~ 18 之间。 |
|
TStringMbcsByteType |
enum TStringMbcsByteType { mbSingleByte, mbLeadByte, mbTrailByte };
字节类型,字符串里面每个字节的类型。
mbSingleByte |
单字节字符 |
mbLeadByte |
前导字节。双字节字符的前面一个字节,等于字符编码的高 8 位 |
mbTrailByte |
后尾字节。双字节字符的后面一个字节,等于字符编码的低 8 位 |
注1:四字节字符的顺序是 {前导字节1,后尾字节1,前导字节2,后尾字节2},即两个双字节字符组成一个四字节字符。
GB18030 编码是通过后尾字节的值来判断是否由两个双字节字符组成一个四字节字符。
注2:前导字节是有规定范围的,都是 0x80 之后的字节值,根据不同的编码,会有具体的取值范围;
后尾字节可以是任何一个值,包括英文字母、数字和符号等,包括 GBK 和 BIG5 编码都是这样。
因此,在自己解码的时候要先判断前导字节,然后认为前导字节后面的字节就是后尾字节。
【例1:双字节字符集 (DBCS) 的例子 - GBK 编码的例子】
【例2:多字节字符集 (MBCS) 的例子 - GB18030 编码的例子】 |
protected: |
|
StrRec |
#pragma pack(push,1)
struct StrRec
{
#ifdef _WIN64
int _Padding;
#endif /* _WIN64 */
unsigned short codePage;
unsigned short elemSize;
int refCnt;
int length;
};
#pragma pack(pop)
字符串信息结构体类型,提供给 GetRec, ElementSize, RefCount, 和 CodePage 方法使用。
codePage |
字符串的代码页,点此处查看代码页列表 |
elemSize |
每个元素的字节数,对于 ANSI 编码每个元素是 1 个字节 |
refCnt |
引用计数 |
length |
字符串长度,和 s.Length() 相等 |
在 Data 数据成员指针指向的数据之前的 sizeof(StrRec) 个字节的内容,就是 StrRec 结构体;
就是说,Data 指针并没有指向内存的首地址,而是指向的字符串的第一个字符,
内存的开始部分是 StrRec 结构体,接下来是第一个字符、第二个字符……、字符串结束符。
这个结构体的位置,用程序代码说明,就是:
StrRec &rec = ((StrRec*)s.data())[-1]; |
如果这段代码还不够清晰,再用另一段同样效果的代码说明一下这个结构体的位置:
char *pStrData = (char *)s.data() - sizeof(StrRec); // 就在 s.data() 之前的 sizeof(StrRec) 个字节
StrRec &rec = *(StrRec *)pStrData;
// 这个地址里面的内容引用出来,就是 StrRec 结构体 |
【例:赋值、数据指针、引用计数的测试】 |
属性 • 方法 • 事件 • 类型 • 数据 • 返回 AnsiStringBase 类
|