如何将包含小数点的字母数字(引用)数字转换为Mathematica中的字符串

时间:2011-04-08 15:26:41

标签: wolfram-mathematica

我有以下类型的参考编号DAA76647.1,我想在Mathematica中将其未更改为字符串。

那是

myfn [DAA76647.1]

作为输出

“DAA76647.1”

有一种简单的方法吗? (输入不能是字符串,除了转换为字符串之外,我不想以任何其他方式更改输入。)

更新

ToString /@ {A1234, 1234.1, A1234 .5}

给出以下输出(我只是从键盘输入了所有内容)

{"A1234", "1234.1", "0.5 A1234"}

如果小数点前面的数字是字母数字,则表明存在问题。

可能的解决方法

根据David Carraher建议的解决方案,可能的方法如下:

ToString[# /.a_ b_ :> ToString[b] <> StringDrop[ToString[a], 1]] & /@ {A1234, 
  1234.1, A1234 .5}

作为输出:

{"A1234", "1234.1", "A1234.5"}

这似乎工作正常,只要小数点后面的内容不是字母数字,并且前提是之前的内容不是以零开头(例如,0A123.1)。

如果字母数字仅在小数点后出现,则可以合并

StringReplace[ToString[123.45 B55c], Whitespace -> ""]

但如果字母数字出现在小数点之前和之后,则仍需要将数字作为字符串输入。

David Carraher的原始建议

f[Times[a_, b_]] := ToString[b] <> ToString[a] 

3 个答案:

答案 0 :(得分:3)

在将Input转换为表达式的阶段,应截取对myfn[DAA76647.1]的调用。

您可以看到输入的格式为RowBox[{"myfn", "[", RowBox[{"DAA76647", ".1"}], "]"}]

In[1]:= myfn[DAA76647 .1]
DownValues[InString]

Out[1]= myfn[0.1 DAA76647]

Out[2]= {HoldPattern[InString[1]] :> 
  ToString[RowBox[{"myfn", "[", RowBox[{"DAA76647", ".1"}], "]"}], 
   InputForm], 
 HoldPattern[InString[2]] :> 
  ToString[RowBox[{"DownValues", "[", "InString", "]"}], InputForm]}

我们可以为MakeExpression创建一个特殊的案例定义:

MakeExpression[RowBox[{"myfn", "[", RowBox[{"DAA76647", ".1"}], "]"}],
   f_] := MakeExpression[RowBox[{"myfn", "[", "\"DAA76647.1\"", "]"}],
   f]

您可以看到现在myfn[DAA76647 .1]按预期工作:

In[4]:= myfn[DAA76647 .1]//FullForm
Out[4]//FullForm= myfn["DAA76647.1"]

这种方法可以推广到类似

的方法
MakeExpression[RowBox[{"myfn", "[", expr:Except[_String], "]"}], form_] := 
 With[{mexpr = StringJoin[expr /. RowBox -> List]}, Hold[myfn[mexpr]]]
myfn[expr_String] := (* what ever you want to do here *)

请注意,Except[_String]部分并不是真正需要的......因为以下代码不会对字符串做任何错误。
目前,代码仅适用于具有一维框结构的简单示例。如果您想要处理更多常规输入的内容,您可能希望为SuperscriptBox和朋友之类的内容添加错误检查或额外规则。或者使用Evaluate[Alternatives @@ Symbol /@ Names["*Box"]] -> List的锤子击打它以使所有Box对象成为列表并将所有内容压扁。

答案 1 :(得分:2)

如果您通过Mma笔记本中的输入单元格输入DAA76647DAA76647.1,Mma会将这些字符解释为乘法。当您输入时,它甚至会自动在7和.1之间插入一个空格(至少在Mma 8中)。

DAA76647DAA76647 .1 // FullForm

(*Out= Times[0.1`,DAA76647DAA76647] *)

这看起来很有希望:

f[Times[a_, b_]] := ToString[b] <> ToString[a]

<小时/> 的修改: 然而,正如TomD所指出的那样(我不知何故错过了),它为解决方案增加了额外的零点!

f[Times[DAA76647DAA76647 .1]]
(*Out= DAA76647DAA766470.1  *)

%//FullForm
"DAA76647DAA766470.1"

TomD后来展示了如何通过StringDrop ping零来处理这个问题。

如果只有小数点右侧出现数字并且左侧部分未被解释为产品,则此更正解决方案将起作用。

如果您尝试输入DAA76647.01A,Mma会将其解析为

(*Out= Times[".01",A,DAA76647]    *)

请注意,它会更改组件的顺序。

我看不到处理这种重新排序的方法。

答案 2 :(得分:2)

我认为你不能在函数调用的括号之间直接输入,但是

myfn[InputString[]] 

为你工作?