我有一个10123X123456
形式的字符串值,其中10
是年份,123
是一年中的日期编号,其余的是系统生成的独特内容。在某些情况下,我需要在日期编号中添加400,以便上面的数字变为10523X123456
。
我的第一个想法是对这三个字符进行子串,将它们转换为整数,向其添加400,将它们转换回字符串,然后在原始字符串上调用replace
。这很有效。
但是后来我发现我真正需要改变的唯一一个角色是第三个,原始值总是0-3,所以永远不会有任何“携带”问题。我进一步想到,数字的ASCII码点是连续的,因此例如将数字4加到字符“0”将导致“4”,依此类推。这就是我最终做的事情。
我的问题是,有什么理由不会一直有效吗?我通常避免使用“ASCII算术”,因为它不是跨平台或国际化友好的。但似乎有理由假设数字的代码点总是顺序的,即“4”总是比“3”多1。有人看到这个推理有什么问题吗?
这是代码。
string input = "10123X123456";
input[2] += 4;
//Output should be 10523X123456
答案 0 :(得分:9)
从C ++标准,第2.2.3节:
在源和执行基本字符集中,每个字符的值在0之后 上面的十进制数字列表应大于前一个值。
所以,是的,如果你保证永远不需要随身携带,那么你很高兴。
答案 1 :(得分:5)
C ++语言定义要求数字的代码点值是连续的。因此,ASCII算术是完全可以接受的。
答案 2 :(得分:3)
请记住,如果这是由您无法完全控制的内容(例如用户和第三方系统)生成的,那么某些内容可能会出现问题。 (查看墨菲定律)
所以我认为在这样做之前至少应该进行一些验证。
答案 3 :(得分:1)
听起来像改变字符串就像你描述的那样比首先解析数字更容易。因此,如果您的算法有效(并且它确实按照您的描述进行),我认为它不会过早优化。
当然,添加400后,它不再是日期编号,因此您无法递归应用此过程。
而且,<
强制性的2100年警告>
。
答案 4 :(得分:1)
很久以前我看到了一些x86处理器instructions for ASCII and BCD。
这些是AAA(增加的ASCII调整),AAS(减法),AAM(多),AAD(div)。
但即使您不确定目标平台,也可以参考您正在使用的字符集规范,我猜您会发现ASCII的前127个字符对于所有字符集始终具有相同的含义(对于首先是unicode)人物页面。)