给定一个string
数组,我想找到第一个可以在不使用异常的情况下成功转换为real
的数组。
我在火卫一中看到的唯一相关函数是 std.conv.to
和 std.conv.parse
,但如果它们无法转换字符串,这两个函数都会引发异常。我想避免异常,因为这不会是我的用例的特殊情况。
C# 正是为此提供了TryParse
。D中有什么类似的东西吗?
(当然,我可以自己解析字符串以确定它是否可以转换为 real
,但这并不重要,所以如果可能的话,我想避免这种情况)。
火卫一似乎没有办法无一例外地做到这一点,除了std.stream
。问题是std.stream
似乎已被弃用。这是一个将sscanf
与double
一起使用的示例,尽管我不知道如何使用real
extern (C) int sscanf(const char* input, const char* format, ...);
auto tryParseDouble(string input) {
import std.string;
import std.typecons;
double result;
if (sscanf(input.toStringz, "%lf".toStringz, &result) == 1) {
return Nullable!double(result);
} else {
return Nullable!double();
}
}
void main() {
import std.algorithm;
import std.range;
import std.stdio;
auto myArray = ["foo", "bar", "3.14", "42"];
auto x = myArray
.map!(tryParseDouble)
.filter!(x => !x.isNull)
.front
.get;
writeln(x);
}
虽然 sscanf() 可以工作,但它是不安全的。我会打开一个增强请求。
尝试改编火卫一代码,返回NaN而不是抛出。