基础类库的东西看起来容易做起来难,今天花时间实现了一点点 .Net 风格的字符串格式化函数,贴出来娱乐一下。
注意:目前仅支持占位符索引号而已...
- import std.stdio;
- import std.string;
- import std.conv;
-
- alias void delegate(char c) Sink;
- alias void* Argument;
-
- const size_t MaxArguments = 16;
-
- void format(char[] fmt, Sink sink, Argument argPtr, TypeInfo[] argtis)
- {
- assert(argtis.length <= MaxArguments, "format: Too many arguments");
- Argument[MaxArguments] args = void;
-
- foreach (size_t i, ti; argtis)
- {
- args[i] = argPtr;
-
-
- argPtr += (ti.tsize + int.sizeof - 1) & ~ (int.sizeof - 1);
- }
-
- doFormat(fmt, sink, args, argtis);
- }
-
- void format(char[] fmt, Sink sink, ...)
- {
- format(fmt, sink, _argptr, _arguments);
- }
-
- size_t skipSpaces(char[] str)
- {
- size_t i;
- for(i = 0; i < str.length; i++)
- {
- if(str[i] != ' ')return i;
- }
- return i;
- }
-
- uint extractNumber(char[] str)
- {
- size_t len = 0;
- foreach(char c; str)
- {
- if(c >= '0' && c <= '9') len++;
- else break;
- }
- if(len == 0)
- throw new Exception("Format: syntax error");
- return toUint(str[0 .. len]);
- }
-
- size_t findRightBrach(char[] str)
- {
- foreach(size_t i, char c; str)
- {
- if(c == '}')
- return i;
- }
-
-
- throw new Exception("Format: Syntax error");
- }
-
- void doFormat(char[] fmt, Sink sink, Argument[] args, TypeInfo[] ti)
- {
- for(size_t i = 0; i < fmt.length;)
- {
-
- for(; i < fmt.length && fmt[i] != '{'; i++)
- sink(fmt[i]);
-
- if(i >= fmt.length)break;
-
-
- if(i < fmt.length - 1 && fmt[i + 1] == '{')
- {
- i += 2;
- sink('{');
- continue;
- }
-
- size_t beginBrach = i;
- size_t endBrach = i + findRightBrach(fmt[i .. $]);
-
-
- doParse(fmt[beginBrach + 1 .. endBrach], sink, args, ti);
-
- i = endBrach + 1;
- }
- }
-
- void doParse(char[] fmt, Sink sink, Argument[] args, TypeInfo[] ti)
- {
- size_t i = 0;
- i += skipSpaces(fmt);
-
- uint index = extractNumber(fmt);
-
-
- int *iptr = cast(int*)args[index];
- foreach(char c; std.string.toString(*iptr))
- sink(c);
- }
-
- void print(char[] fmt, ...)
- {
- void sink(char c)
- {
- writef(c);
- }
-
- format(fmt, &sink, _argptr, _arguments);
- }
-
- void main()
- {
- print("Hello {0} {2} brach{{}}brach {1} Dotmars\n", 111, 2222, 333);
- }
分享到:
相关推荐
### VB.NET与Java通过SOAP协议...综上所述,无论是使用VB.NET还是Java,通过SOAP协议与WebService交互的基本流程是相似的,主要区别在于语法糖和字符串处理等方面。理解和掌握这些基本概念对于开发者来说是非常重要的。
3. 序列化签名:签名结果通常是一个二进制数组,需要转换为可传输的格式,如Base64字符串。 在Java端,我们使用`java.security.Signature`类来验证签名。验证步骤包括: 1. 加载公钥:从.NET发送的Base64编码的...
- `res`:资源文件,包括布局XML文件(定义用户界面)、图象资源、字符串资源等。 3. `AndroidManifest.xml`:应用的配置文件,定义了应用的基本信息、权限和组件声明。 4. `build.gradle`:构建脚本,定义了项目的...
- 反序列化: 将 JSON 字符串转换为 Java 对象。 以上就是 Java 基础知识点的总结,这些知识点涵盖了 Java 语言的核心特性,对于初学者来说是非常重要的学习内容。掌握这些基础知识不仅有助于深入理解 Java 的工作...
2. **JSON字符串到Java对象的反序列化**:同样,Gson也可以将JSON字符串解析为对应的Java对象。例如,从JSON字符串创建User对象,可以使用`Gson().fromJson(jsonString, User.class)`。 3. **自定义序列化和反序列...
1. **随机数据生成**:`randomData()` 方法用于生成随机数据字符串,该字符串随后可以被压缩存储到 ZIP 文件中。 2. **文件打开与解压**:`openFile()` 方法实现了文件的打开以及使用 `ZipInputStream` 对其进行解...
当我们需要将XML格式的字符串转换为List对象时,这通常涉及到数据解析的过程。这篇博客“xml格式的字符串转换成List”提供了相关的方法和步骤,以下是对这个主题的详细讲解。 首先,理解XML字符串。XML字符串是由一...
`String.format()`允许格式化字符串,类似于C语言的`printf`函数。 这些基本操作是Java字符串处理的核心。通过实践这些实例,初学者可以更好地理解字符串操作的原理和用法,为以后的开发打下坚实基础。在压缩包中...
1. **初始化**:接收JSON字符串和拆分长度作为参数。 2. **解析JSON**:使用Fastjson的`JSON.parseArray()`方法将JSON字符串转化为`JSONArray`对象。 3. **递归拆分**:定义一个递归方法,检查当前数组的长度。如果...
在Java和.NET间交换密钥时,可能需要将密钥序列化为字符串或二进制格式,然后在另一端反序列化。例如,Java的`KeySpec`接口和.NET的`System.Text.Encoding`类可用于转换密钥。 6. **PKCS7填充**: 对于某些加密...
4. **文本搜索**:`javax.swing.text`包中的`JTextComponent`类提供`find`方法,可用于在文本中查找指定字符串。 5. **格式化**:`javax.swing.text`包的`Style`和`StyleConstants`类可帮助我们设置文本的格式,如...
这可能涉及字符串分割、正则表达式匹配或者JSON/XML解析等,具体取决于数据格式。例如,如果数据是以逗号分隔值(CSV)格式,可以使用`String.split()`方法来拆分。 4. **MySQL数据库操作** 在Java中,我们可以使用...
6. **字符串处理**:Java中的String类是不可变的,学习如何创建、比较、操作和格式化字符串是必要的。 7. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块捕获和处理程序运行时可能出现的错误...
它是一个键值对的存储系统,支持基本数据类型,如布尔型、整型、浮点型、字符串以及它们的数组。在标题“使用SharedPreferences保存一些数据”中,我们主要探讨的是如何通过SharedPreferences来存储和检索应用程序中...
此外,源代码还可能包含了错误处理和用户界面优化的细节,比如按钮的点击反馈效果、键盘的隐藏与显示、结果的格式化等。这些都体现了安卓应用开发中的用户体验设计原则。 总的来说,这个"安卓开发计算器源代码"是一...
2. 十六进制字符串的每个字符代表4位二进制,因此每个字节需要两位十六进制字符表示,所以常使用"02X"或"02x"作为格式化字符串。 3. 在转换过程中,可能会遇到字节顺序问题,特别是在处理网络字节序和本地字节序时。...
1. **fmt** - 国际化和格式化支持,如日期、时间、数字和消息的格式化。 2. **fn** - 函数库,提供了许多有用的操作字符串和数组的方法。 3. **i18n** - 提供国际化资源包管理。 4. **sql** - 支持数据库操作,如...
这可能涉及到类型转换、日期格式化、多级嵌套对象的处理等复杂逻辑。 4. **数据验证**:在解析过程中,框架可以执行数据验证,确保输入的数据符合业务规则。例如,检查数值是否在合理范围内,字符串是否符合特定...