给定一个string
数组,我想找到第一个可以成功转换为real
而不使用异常的数据。
我在Phobos中可以看到的唯一相关函数是std.conv.to
和std.conv.parse
,但如果它们无法转换字符串,这两个函数都会抛出异常。我想避免例外,因为这对我的用例来说不是一个例外情况。
C#提供了TryParse
。 D中有类似的东西吗?
(当然,我可以自己解析字符串以确定它是否可以转换为real
,但它是非平凡的,所以如果可能的话我想避免使用它。)
答案 0 :(得分:2)
除了std.stream
之外,Phobos似乎没有办法在没有例外情况下做到这一点。问题是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);
}
答案 1 :(得分:0)
虽然sscanf()有效,但它不安全。我会打开一个增强请求。
尝试调整Phobos代码,返回NaN而不是抛出。