2

数値を受け取り、それを指定されたとおりに文字列として返す関数が必要だとします。以下は機能しません。

SetAttributes[foo, HoldAllComplete];
foo[x_] := ToString[Unevaluated@x]

foo[.2]との出力foo[.20]は同じです。

これを行う理由は、区切り記号としてドットを使用した日付を理解できる関数が必要だからですf[2009.10.20]。これは Mathematica の奇妙な乱用であることは理解していますが、私はドメイン固有言語を作成しており、eval (ToExpression) を実行するだけでそのパーサーとして Mathematica を使用したいと考えています。2009.01.02 のように 2 桁の日と月に頼ることができれば、実際にこれを機能させることができますが、2009.1.2 も許可したいので、上記の質問に要約されます。

唯一の答えは、文字列として渡してから解析することだと思いますが、おそらく私にはわからないトリックがあります。これはこの質問に関連していることに注意してください: Mathematica: Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc etc

4

3 に答える 3

6

Mathematica の float 解析には頼りません。MakeExpression代わりに、 for のルールを定義しますfoo。これにより、フロートに解析される前に、入力をボックスとしてインターセプトできます。このルールのペアは、少なくともStandardForm:

MakeExpression[RowBox[{"foo", "[", dateString_, "]"}], StandardForm] :=
  With[{args = Sequence @@ Riffle[StringSplit[dateString, "."], ","]},
    MakeExpression[RowBox[{"foo", "[", "{", args, "}", "]"}], StandardForm]]

MakeExpression[RowBox[{"foo", "[", RowBox[{yearMonth_, day_}], "]"}], 
    StandardForm] :=
  With[{args = 
    Sequence @@ Riffle[Append[StringSplit[yearMonth, "."], day], ","]},
      MakeExpression[RowBox[{"foo", "[", "{", args, "}", "]"}], StandardForm]]

2 番目のルールが必要だったのは、数値に小数点以下第 2 位を入力しようとすると、ノートブック インターフェイスが "役立つ" スペースを挿入するためです。

編集:カーネルからこれを使用するには、フロント エンドを使用する必要がありますが、バージョン 7 では多くの場合非常に簡単です。式を文字列として取得できる場合は、次UsingFrontEndと組み合わせて使用​​しToExpressionます。

 UsingFrontEnd[ToExpression["foo[2009.09.20]", StandardForm]

EDIT 2:で遊びたい場合は、多くの可能性があります。これにより、解析される前に、入力に特別な処理を文字列として$PreRead適用できます。

于 2009-10-27T13:20:22.557 に答える
3
$PreRead = If[$FrontEnd =!= Null, #1, 
StringReplace[#,x:NumberString /; StringMatchQ[x,"*.*0"] :>
     StringJoin[x, "`", ToString[
       StringLength[StringReplace[x, "-" -> ""]] - 
        Switch[StringTake[StringReplace[x, 
           "-" -> ""], 1], "0", 2, ".", 1, _, 
         1]]]]] & ; 

foo[.20] を foo[0.20] として表示します。その InputForm は foo[0.2`2.] になります。

Mathematica での数値形式の解析と表示は、本来よりも難しいと思います...

于 2010-02-16T10:54:06.100 に答える
1

浮動小数点数は、IIRC によって Mathematica によって実際の浮動小数点数に解析されるため、やりたいことを実際に行う方法はありません。

于 2009-10-27T00:57:02.090 に答える