Wolfram mathematica 如何在Mathematica中将包含小数点的字母数字(参考)转换为字符串

Wolfram mathematica 如何在Mathematica中将包含小数点的字母数字(参考)转换为字符串,wolfram-mathematica,Wolfram Mathematica,我有一个以下类型的参考号DAA76647.1,我想在Mathematica中将其转换为字符串 就是 myfn[DAA76647.1] 作为输出给出 “DAA76647.1” 有没有一个简单的方法可以做到这一点?(输入不能是字符串,除转换为字符串外,我不想以任何其他方式更改输入) 更新 ToString /@ {A1234, 1234.1, A1234 .5} 给出以下输出(我只是简单地从键盘输入了所有内容) 如果小数点之前的是字母数字,则可能存在问题 可能的解决方法 根据建议的解决方案,可能的

我有一个以下类型的参考号DAA76647.1,我想在Mathematica中将其转换为字符串

就是

myfn[DAA76647.1]

作为输出给出

“DAA76647.1”

有没有一个简单的方法可以做到这一点?(输入不能是字符串,除转换为字符串外,我不想以任何其他方式更改输入)

更新

ToString /@ {A1234, 1234.1, A1234 .5}
给出以下输出(我只是简单地从键盘输入了所有内容)

如果小数点之前的是字母数字,则可能存在问题

可能的解决方法

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

ToString[# /.a_ b_ :> ToString[b] <> StringDrop[ToString[a], 1]] & /@ {A1234, 
  1234.1, A1234 .5}
如果小数点后的不是字母数字,并且小数点前的不是以零开头(例如0A123.1),那么这似乎可以正常工作

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

StringReplace[ToString[123.45 B55c], Whitespace -> ""]
但是,如果字母数字出现在小数点之前和之后,则仍然需要将数字作为字符串输入

大卫·卡拉赫的原始建议

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

如果通过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后来展示了如何通过ping零来处理这个问题

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

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

(*Out= Times[".01",A,DAA76647]    *)
请注意,它会更改零部件的顺序


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

我不认为您可以直接在函数调用的括号之间键入,但您可以

myfn[InputString[]] 

是否为您工作?

应在将输入转换为表达式的阶段拦截对
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 *)
请注意,
除了[\u String]
部分实际上并不需要。。。因为以下代码不会对字符串执行任何错误操作。

目前,该代码仅适用于具有一维长方体结构的简单示例。如果您想要处理更一般的输入,您可能需要为
SuperscriptBox
和friends等添加错误检查或额外规则。或者用
Evaluate[alternations@@@Symbol/@Names[“*Box”]->List
的锤子敲击它,使所有Box对象成为列表,并将所有内容压平。

@David。我遇到的问题是,
ToString
不会做我想做的事情。使用mma7(在Mac上)时,我得到“0.1 DAA76647”作为输出。“也许我在做傻事?”大卫。谢谢你的回答。我很抱歉坚持这一点,但是您非常好的方法也在小数点前插入了一个额外的零。该编号为登录号(见上文)。我还希望soln尽可能通用,例如处理DAA766.1A4。(正是小数点给我带来了麻烦)。@TomD我们可以假设数据是通过键盘输入到Mma笔记本电脑的输入单元中吗?嗯。这比我最初想象的要困难得多@大卫。将
StringDrop
与您最初的建议结合使用似乎提供了一种可能的解决方法。如果你这么认为,也许你可以把这个方法作为你回复的一部分?非常感谢您的帮助。您的意见来自哪里?@Michael。这个数字是数据库的登录号,我希望它成为我生成的从数据库导入的字符串的一部分。我不希望要求用户必须输入字符串(可能是剪切粘贴)。(其他独特的标识符,如GI:8375436很容易处理,但我想给你一个选择)。@TomD我想Michael的问题是:DAA76647.1是什么格式的?我(下面)假设它是直接从键盘输入的。但是他们是如何通过键盘或复制/粘贴输入的呢?您使用的是输入字段吗?占位符?直接粘贴到单元格中?如果您不将输入保持为字符串,有很多方法可以中断代码,因为解析器会试图将输入解释为表达式。@Michael。我不认为有任何混乱。我通过键盘输入,我想转换成字符串
ToString[A1234]
ToString[1234.5]
按预期工作,但
ToString[A1234.5]
没有。我不准备以字符串形式输入。如果我有很多这样的数字,这可能会很乏味。我想皈依。(我当然可以在诸如word和Import(给出字符串)之类的字处理器中汇编这些数字的列表),但这似乎太疯狂了。我不知道你的答案是CW,是不是因为你想让别人编辑它……但不管怎样,我做了你提到的概括!@Simon谢谢你。我的答案是CW,因为我在概括方面有困难,需要帮助。@Sjoerd。这很接近,而且可能是一种方式。看起来是t尽管我必须以字符串的形式输入(或者使用文字处理器组装一个大的列表,然后导入)。非常感谢(以及之前的帮助)
MakeExpression[RowBox[{"myfn", "[", RowBox[{"DAA76647", ".1"}], "]"}],
   f_] := MakeExpression[RowBox[{"myfn", "[", "\"DAA76647.1\"", "]"}],
   f]
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 *)