`
oldrev
  • 浏览: 234405 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

.Net/Java 风格格式化字符串

阅读更多

基础类库的东西看起来容易做起来难,今天花时间实现了一点点 .Net 风格的字符串格式化函数,贴出来娱乐一下。

注意:目前仅支持占位符索引号而已...

  1. import std.stdio;
  2. import std.string;
  3. import std.conv;
  4. alias void delegate(char c) Sink;
  5. alias void* Argument;
  6. const size_t MaxArguments = 16;
  7. void format(char[] fmt, Sink sink, Argument argPtr, TypeInfo[] argtis)
  8. {
  9. assert(argtis.length <= MaxArguments, "format: Too many arguments");
  10. Argument[MaxArguments] args = void;
  11. //填充参数指针
  12. foreach (size_t i, ti; argtis)
  13. {
  14. args[i] = argPtr;
  15. //来自于 stdarg.d,避免不同CPU建构中堆栈结构差异
  16. argPtr += (ti.tsize + int.sizeof - 1) & ~ (int.sizeof - 1);
  17. }
  18. doFormat(fmt, sink, args, argtis);
  19. }
  20. void format(char[] fmt, Sink sink, ...)
  21. {
  22. format(fmt, sink, _argptr, _arguments);
  23. }
  24. size_t skipSpaces(char[] str)
  25. {
  26. size_t i;
  27. for(i = 0; i < str.length; i++)
  28. {
  29. if(str[i] != ' ')return i;
  30. }
  31. return i;
  32. }
  33. uint extractNumber(char[] str)
  34. {
  35. size_t len = 0;
  36. foreach(char c; str)
  37. {
  38. if(c >= '0' && c <= '9') len++;
  39. else break;
  40. }
  41. if(len == 0)
  42. throw new Exception("Format: syntax error");
  43. return toUint(str[0 .. len]);
  44. }
  45. size_t findRightBrach(char[] str)
  46. {
  47. foreach(size_t i, char c; str)
  48. {
  49. if(c == '}')
  50. return i;
  51. }
  52. //大括号不匹配
  53. throw new Exception("Format: Syntax error");
  54. }
  55. void doFormat(char[] fmt, Sink sink, Argument[] args, TypeInfo[] ti)
  56. {
  57. for(size_t i = 0; i < fmt.length;)
  58. {
  59. //跳过非占位符
  60. for(; i < fmt.length && fmt[i] != '{'; i++)
  61. sink(fmt[i]);
  62. if(i >= fmt.length)break;
  63. // "{{" 转义,输出 '{' 即可
  64. if(i < fmt.length - 1 && fmt[i + 1] == '{')
  65. {
  66. i += 2;
  67. sink('{');
  68. continue;
  69. }
  70. size_t beginBrach = i;
  71. size_t endBrach = i + findRightBrach(fmt[i .. $]);
  72. // parsing the format string
  73. doParse(fmt[beginBrach + 1 .. endBrach], sink, args, ti);
  74. i = endBrach + 1;
  75. }
  76. }
  77. void doParse(char[] fmt, Sink sink, Argument[] args, TypeInfo[] ti)
  78. {
  79. size_t i = 0;
  80. i += skipSpaces(fmt);
  81. //提取索引号
  82. uint index = extractNumber(fmt);
  83. ////TODO: 其他类型支持在此处添加
  84. int *iptr = cast(int*)args[index];
  85. foreach(char c; std.string.toString(*iptr))
  86. sink(c);
  87. }
  88. void print(char[] fmt, ...)
  89. {
  90. void sink(char c)
  91. {
  92. writef(c);
  93. }
  94. format(fmt, &sink, _argptr, _arguments);
  95. }
  96. void main()
  97. {
  98. print("Hello {0} {2} brach{{}}brach {1} Dotmars\n", 111, 2222, 333);
  99. }

分享到:
评论
1 楼 DavidL 2007-05-20  
呵呵,是我的话抄袭Tango的就算了

相关推荐

    VB.NET/JAVA 采用SOAP 与Webservice发送/接收数据

    ### VB.NET与Java通过SOAP协议...综上所述,无论是使用VB.NET还是Java,通过SOAP协议与WebService交互的基本流程是相似的,主要区别在于语法糖和字符串处理等方面。理解和掌握这些基本概念对于开发者来说是非常重要的。

    .net与java中的互操作(rsa签名与验签、加密与解密)

    3. 序列化签名:签名结果通常是一个二进制数组,需要转换为可传输的格式,如Base64字符串。 在Java端,我们使用`java.security.Signature`类来验证签名。验证步骤包括: 1. 加载公钥:从.NET发送的Base64编码的...

    今天吃什么?app简易设计

    - `res`:资源文件,包括布局XML文件(定义用户界面)、图象资源、字符串资源等。 3. `AndroidManifest.xml`:应用的配置文件,定义了应用的基本信息、权限和组件声明。 4. `build.gradle`:构建脚本,定义了项目的...

    java基础知识点总结思维导图

    - 反序列化: 将 JSON 字符串转换为 Java 对象。 以上就是 Java 基础知识点的总结,这些知识点涵盖了 Java 语言的核心特性,对于初学者来说是非常重要的学习内容。掌握这些基础知识不仅有助于深入理解 Java 的工作...

    开源gson,最简单直观的demo演示

    2. **JSON字符串到Java对象的反序列化**:同样,Gson也可以将JSON字符串解析为对应的Java对象。例如,从JSON字符串创建User对象,可以使用`Gson().fromJson(jsonString, User.class)`。 3. **自定义序列化和反序列...

    利用Java实现zip压缩解压缩

    1. **随机数据生成**:`randomData()` 方法用于生成随机数据字符串,该字符串随后可以被压缩存储到 ZIP 文件中。 2. **文件打开与解压**:`openFile()` 方法实现了文件的打开以及使用 `ZipInputStream` 对其进行解...

    xml格式的字符串转换成List

    当我们需要将XML格式的字符串转换为List对象时,这通常涉及到数据解析的过程。这篇博客“xml格式的字符串转换成List”提供了相关的方法和步骤,以下是对这个主题的详细讲解。 首先,理解XML字符串。XML字符串是由一...

    Java 字符串操作源码实例集.rar

    `String.format()`允许格式化字符串,类似于C语言的`printf`函数。 这些基本操作是Java字符串处理的核心。通过实践这些实例,初学者可以更好地理解字符串操作的原理和用法,为以后的开发打下坚实基础。在压缩包中...

    工具类,根据给定长度,使用递归的方式拆分一个json成为多个json组成的列表

    1. **初始化**:接收JSON字符串和拆分长度作为参数。 2. **解析JSON**:使用Fastjson的`JSON.parseArray()`方法将JSON字符串转化为`JSONArray`对象。 3. **递归拆分**:定义一个递归方法,检查当前数组的长度。如果...

    java和.net交换加密算法(.net版本)+(java版本)

    在Java和.NET间交换密钥时,可能需要将密钥序列化为字符串或二进制格式,然后在另一端反序列化。例如,Java的`KeySpec`接口和.NET的`System.Text.Encoding`类可用于转换密钥。 6. **PKCS7填充**: 对于某些加密...

    MyNote.zip

    4. **文本搜索**:`javax.swing.text`包中的`JTextComponent`类提供`find`方法,可用于在文本中查找指定字符串。 5. **格式化**:`javax.swing.text`包的`Style`和`StyleConstants`类可帮助我们设置文本的格式,如...

    JAVA串口助手接收数据并解析数据存入MySQL数据库中

    这可能涉及字符串分割、正则表达式匹配或者JSON/XML解析等,具体取决于数据格式。例如,如果数据是以逗号分隔值(CSV)格式,可以使用`String.split()`方法来拆分。 4. **MySQL数据库操作** 在Java中,我们可以使用...

    21天学通JAVA2 (第三版)

    6. **字符串处理**:Java中的String类是不可变的,学习如何创建、比较、操作和格式化字符串是必要的。 7. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块捕获和处理程序运行时可能出现的错误...

    使用SharedPreferences保存一些数据

    它是一个键值对的存储系统,支持基本数据类型,如布尔型、整型、浮点型、字符串以及它们的数组。在标题“使用SharedPreferences保存一些数据”中,我们主要探讨的是如何通过SharedPreferences来存储和检索应用程序中...

    安卓开发计算器源代码

    此外,源代码还可能包含了错误处理和用户界面优化的细节,比如按钮的点击反馈效果、键盘的隐藏与显示、结果的格式化等。这些都体现了安卓应用开发中的用户体验设计原则。 总的来说,这个"安卓开发计算器源代码"是一...

    android byte字节数组转换十六进制字符串

    2. 十六进制字符串的每个字符代表4位二进制,因此每个字节需要两位十六进制字符表示,所以常使用"02X"或"02x"作为格式化字符串。 3. 在转换过程中,可能会遇到字节顺序问题,特别是在处理网络字节序和本地字节序时。...

    jstl 标签使用包

    1. **fmt** - 国际化和格式化支持,如日期、时间、数字和消息的格式化。 2. **fn** - 函数库,提供了许多有用的操作字符串和数组的方法。 3. **i18n** - 提供国际化资源包管理。 4. **sql** - 支持数据库操作,如...

    自定义Excel解析框架源码

    这可能涉及到类型转换、日期格式化、多级嵌套对象的处理等复杂逻辑。 4. **数据验证**:在解析过程中,框架可以执行数据验证,确保输入的数据符合业务规则。例如,检查数值是否在合理范围内,字符串是否符合特定...

Global site tag (gtag.js) - Google Analytics