尝试在 D 中进行字符串到实际的转换,没有异常



给定一个string数组,我想找到第一个可以在不使用异常的情况下成功转换为real的数组。

我在火卫一中看到的唯一相关函数是 std.conv.tostd.conv.parse ,但如果它们无法转换字符串,这两个函数都会引发异常。我想避免异常,因为这不会是我的用例的特殊情况。

C# 正是为此提供了TryParse。D中有什么类似的东西吗?

(当然,我可以自己解析字符串以确定它是否可以转换为 real ,但这并不重要,所以如果可能的话,我想避免这种情况)。

火卫一似乎没有办法无一例外地做到这一点,除了std.stream。问题是std.stream似乎已被弃用。这是一个将sscanfdouble一起使用的示例,尽管我不知道如何使用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而不是抛出。

最新更新