1

アップデート

私は問題を発見しました.例外は同じフォームの2番目のフィールドから発生しました.(空だったので).実際には、別の文字列を解析しようとしていたとき...時間を無駄にして申し訳ありません。

元の質問

私はこの問題に完全に唖然としています。私は基本的に実行int.Parse("32")していますが、FormatException. 問題のコードは次のとおりです。

private double BindGeo(string value)
{
    Regex r = new Regex(@"\D*(?<deg>\d+)\D*(?<min>\d+)\D*(?<sec>\d+(\.\d*))");
    Regex d = new Regex(@"(?<dir>[NSEW])");
    var numbers = r.Match(value);
    string degStr = numbers.Groups["deg"].ToString();
    string minStr = numbers.Groups["min"].ToString();
    string secStr = numbers.Groups["sec"].ToString();
    Debug.Assert(degStr == "32");
    var deg = int.Parse(degStr);
    var min = int.Parse(minStr);
    var sec = double.Parse(secStr);
    var direction = d.Match(value).Groups["dir"].ToString();
    var result = deg + (min / 60.0) + (sec / 3600.0);
    if (direction == "S" || direction == "W") result = -result;
    return result;
}

私の入力文字列は"32 19 17.25 N"

上記のコードは、ASP.NET MVC 3 Web アプリケーション (ビュー エンジンとして Razor を使用) 上の .NET 4 Web ホスティング サービス (aspspider) で実行されます。

degStr == "32"のアサーションが有効であることに注意してください。また、上記のコードをコンソール アプリケーションで実行すると、問題なく動作します。私は答えを求めてウェブを精査しましたが、何もありません...

何か案は?

更新 (スタック トレース)

[FormatException: Input string was not in a correct format.]
   System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +9586043
   System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) +119
   System.Int32.Parse(String s) +23
   ParkIt.GeoModelBinder.BindGeo(String value) in C:\MyProjects\ParkIt\ParkIt\GeoBinder.cs:42

42行目はvar deg = int.Parse(degStr);、例外が含まれていることに注意してくださいSystem.Int32.ParseSystem.Double提案されたとおりではありません)。

4

4 に答える 4

3

例外をスローしているのは次の行であると誤って考えています。

int.Parse("32")

この行が例外をスローする可能性はほとんどありません。

実際には次の行です。

var sec = double.Parse(secStr);

この場合secStr = "17.25";

その理由は、ホスティング プロバイダーが.、小数点記号ではない別のカルチャを使用しているためです。

web.config ファイルでカルチャを指定する可能性があります。

<globalization culture="en-US" uiCulture="en-US" />

そうしないと、autoが使用されます。これは、クライアント ブラウザーの設定 (Accept-Language HTTP ヘッダーを使用して各要求と共に送信される) に基づいてカルチャを設定できることを意味します。

別の可能性は、解析時にカルチャを指定することです。

var sec = double.Parse(secStr, CultureInfo.InvariantCulture);

.このようにして、それがインバリアント カルチャの小数点記号であることが確実にわかります。

于 2012-05-02T09:06:53.103 に答える
2

これをテストします (PowerShell 経由):

PS [64] E:\dev #43> '32 19 17.25 N' -match "\D*(?\d+)\D*(?\d+)\D*(?\d+(\.\d*) )"
真実
PS [64] E:\dev #44> $Matches

名前 値
---- -----
秒 17.25
度 32
19分
1.25
0 32 19 17.25

したがって、正規表現は値を取得する 3 つの名前付きキャプチャすべてで動作し、そのすべてが正常に解析されます (つまり、処理しない\dU+0660: ARABIC-INDIC DIGIT ZERO のようなものと一致するようなものでInt32.Parseはありません)。

ただし、正規表現が実際に一致するかどうかは確認しません。

valueしたがって、関数に渡されるのは、期待する入力ではないと思われます。関数の先頭にブレークポイント (またはロギング) を置き、 の実際の値を取得しますvalue

何が起こっていると思います:

  • Valueあなたが思っているものではありません。
  • 正規表現が一致しません。
  • キャプチャは空です
  • Int32.Parse("")スローしています(確認したところ:FormatException「入力文字列は正しい形式ではありませんでした。」をスローします)。

補遺: あなたが主張についてコメントしていることに注意してください。

矛盾しているように思われる場合は、基本に戻ります。たとえば、仮定の少なくとも 1 つが間違っています。例外の行番号が 1 つずれている可能性があります (その行番号に移動する前にファイルを編集する: 非常に簡単です)。

この場合、デバッガーを使用してステップ実行するのが、最も簡単な方法です。すべての式ですべてをチェックします

デバッガーを使用できない場合は、その制限を削除してみてください。そうでない場合、IntelliTrace はどうですか? それ以外の場合は、何らかの種類のログを使用します (アプリにログがない場合は、このようなことで将来必要になるので追加してください)。

于 2012-05-02T10:24:05.173 に答える
1

文字列から非ユニコード(存在する場合-非表示)文字を削除してみてください:

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]", string.Empty);

編集

また、16進値を確認して、例外がどこで実行されているかを確認してください。

BitConverter.ToString(buffer);

これにより、16進値が表示されるため、確認できます...

また、その値を貼り付けて、表示できるようにします。

于 2012-05-02T09:58:13.107 に答える
0

これは問題ではないことがわかりました。問題は、同じフォームの 2 番目のフィールドから例外が発生したことでした (空だったため)。別の文字列を解析しようとしたためです...

お時間を無駄にして申し訳ありません。

于 2012-05-02T11:05:37.000 に答える