我有以下类型的参考编号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]
答案 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[]]
为你工作?