class: TypeConverter
authorClaus Gittinger <cg@exept.de>
Fri, 23 Aug 2013 12:28:38 +0200
changeset 3214 d39b11efa0a6
parent 3213 f89acb58aa7e
child 3215 0b3ad7144d4f
class: TypeConverter added: #symbolOrNumberOrNil changed: #numberWithOptionalScale #possiblePrintConverterTypes
TypeConverter.st
--- a/TypeConverter.st	Sat Aug 10 13:25:55 2013 +0200
+++ b/TypeConverter.st	Fri Aug 23 12:28:38 2013 +0200
@@ -287,18 +287,25 @@
         #numberOrNil
         #numberInRangeOrNil
         #numberOrPointOrNil
+        #numberOrStringOrSymbolOrNil
+        #numberOrSymbolOrNil
+        #numberWithOptionalScale
+        #integer
         #integerInRange
         #integerWithThousandsSeparator
         #fileSize
         #hexadecimal
         #hexIntegerInRange
         #symbolOrNil
+        #symbolOrBooleanOrNil
+        #symbolOrNumberOrNil
         #smalltalkObject
         #smalltalkPoint
+        #literal
+        #date
+        #dateOrNil
         #dateDDMMYYYY
         #dateMMDDYYYY
-        #date
-        #dateOrNil
         #time12H
         #time24H
         #time
@@ -1202,6 +1209,47 @@
 
     "Created: / 21.2.1997 / 18:58:38 / cg"
     "Modified: / 26.5.1998 / 15:06:06 / cg"
+!
+
+symbolOrNumberOrNil
+    "setup the converter to convert from a string to a symbol or number
+     and vice versa. Invalid symbols (i.e. empty) are converted to nil;
+     nil values are converted to an empty string."
+
+    self
+        getBlock:[:model |
+                |symbolValue|
+
+                ((symbolValue := model value) isSymbol 
+                or:[symbolValue isNumber]) 
+                ifFalse:[
+                    ''
+                ] ifTrue:[
+                    symbolValue storeString.
+                ]]
+
+        putBlock:
+                [:model :string |
+
+                |value s|
+
+                string size == 0 ifTrue:[
+                    value := nil
+                ] ifFalse:[
+                    s := string withoutSeparators.
+                    (s startsWith:'#') ifTrue:[
+                        s := s copyFrom:2.
+                        (s startsWith:$') ifTrue:[
+                            s := s copyFrom:2 to:(s size - 1)
+                        ].
+                        value := s asSymbol
+                    ] ifFalse:[
+                        value := Number readFromString:s onError:[s asSymbol].
+                    ].
+                ].
+                model value:value]
+
+        updateBlock: [:m :a :p | true]
 ! !
 
 !TypeConverter methodsFor:'standard converters-numbers'!
@@ -1749,6 +1797,7 @@
     |scaleDict|
 
     scaleDict := Dictionary withKeysAndValues:#(
+            $g 1000000000
             $m 1000000
             $k    1000
             $t    1000
@@ -1878,10 +1927,10 @@
 !TypeConverter class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview2/TypeConverter.st,v 1.69 2013-03-10 16:55:55 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview2/TypeConverter.st,v 1.70 2013-08-23 10:28:38 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libview2/TypeConverter.st,v 1.69 2013-03-10 16:55:55 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview2/TypeConverter.st,v 1.70 2013-08-23 10:28:38 cg Exp $'
 ! !