在没有异常的情况下尝试D中的字符串到实际转换

时间:2013-12-23 11:14:55

标签: parsing type-conversion d phobos

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

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

C#提供了TryParse。 D中有类似的东西吗?

(当然,我可以自己解析字符串以确定它是否可以转换为real,但它是非平凡的,所以如果可能的话我想避免使用它。)

2 个答案:

答案 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而不是抛出。