2011-04-08 583 views
4

我有以下类型的DAA76647.1的参考编号,我想将其转换为Mathematica中的字符串。如何在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"} 

这似乎是工作确定前提条件是小数点后面的数字不是字母数字,并且规定了之前的内容es不以零开始(例如,0A123.1)。

如果只有小数点后数字字母出现,这可以并入

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

但如果字母数字小数点之前和之后发生的数量仍需要输入一个字符串。

大卫Carraher的原建议

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

输入来自哪里? – 2011-04-08 16:13:16

+0

@Michael。数字是数据库的登录号,我希望它成为我从数据库生成的一个_string_的一部分。我不想要求用户必须输入一个字符串(它可能是一个剪切和粘贴)。 (其他独特的identifers,如GI:8375436很容易处理,但我想给出一个选择)。 – tomd 2011-04-08 16:23:50

+0

@TomD我认为Michael的问题是:DAA76647.1采用什么格式?我假设(下)它直接从键盘输入。 – DavidC 2011-04-08 16:32:31

回答

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平零处理这个问题。

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

如果你试图输入DAA76647.01A MMA的将解析它作为

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

注意,它改变了组件的顺序。

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

+0

@David。我遇到的问题是'ToString'不会做我想做的事情,用mma7(在Mac上),我得到“0.1 DAA76647”作为输出结果,也许我在做一些愚蠢的事情吧? – tomd 2011-04-08 15:42:06

+0

@TomD请看看我编辑过的答案 – DavidC 2011-04-08 15:45:57

+0

@David。为了你的回答,我很抱歉坚持这一个,但是y我们非常好的方法还会在小数点之前插入一个额外的零。该号码是登录号码(参见上文)。例如,我也希望soln尽可能地通用,并处理DAA766.1A4。 (这是造成我麻烦的小数点)。 – tomd 2011-04-08 16:37:26

2

我不认为你可以直接在函数调用的括号之间键入这一点,但会

myfn[InputString[]] 

为你工作?

+0

@ Sjoerd。这接近了,可能是要走的路。它看起来好像我将不得不作为一个字符串输入(或使用文字处理器来组装一个大的列表,然后导入)。非常感谢这个(以及以前的帮助) – tomd 2011-04-09 08:59:09

3

myfn[DAA76647.1]的调用在将Input转换为表达式的阶段应该被拦截。

你可以看到输入的形式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"] 

This appr oach可推广到类似

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]部分...因为下面的代码不会做什么不好的String。
目前,代码仅适用于具有一维盒子结构的简单示例。如果你想要处理更多通用输入的东西,你可能需要为SuperscriptBox和朋友添加错误检查或额外规则。或者用Evaluate[Alternatives @@ Symbol /@ Names["*Box"]] -> List的锤子敲击它,使所有Box对象变成列表并将所有东西压扁。

+0

我不知道你是否因为你想让人们编辑或不编辑你的答案,但无论如何 - 我已经提出了你所提到的泛化! – Simon 2011-04-09 02:41:27

+0

@Simon谢谢。我以CW的方式回答了我的问题,因为我在总结时遇到了麻烦,需要帮助。 – 2011-04-09 09:01:53

相关问题