1

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

我可以在 Phobos 中看到的唯一相关函数是std.conv.toand std.conv.parse,但是如果它们无法转换字符串,它们都会抛出异常。我想避免例外,因为这对于我的用例来说不会是例外情况。

C#TryParse正好提供了这一点。D中是否有类似的东西?

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

4

2 回答 2

2

此外,Phobos 似乎没有办法做到这一点std.stream。问题是这std.stream似乎已被弃用。这是一个使用sscanfwith的示例double,尽管我不知道如何使用 with 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);
}
于 2013-12-23T17:05:55.577 回答
0

虽然 sscanf() 有效,但它是不安全的。我会打开一个增强请求。

尝试调整 Phobos 代码,返回 NaN 而不是抛出。

于 2013-12-31T12:27:40.897 回答