#! #! characters, for example: Start Attribute: x y234.5555 Text Part At: Start Decimal Places: 2 Result Attribute: x y234.56 # TRANSFORMER_END #! VIEW_POSITION="18 0" #! ZOOM_SCALE="109" #! GRID_VISIBLE="false" #! SHOW_ANNOTATIONS="true" #! WORKSPACE_VERSION="1" #! SHOW_BOOKMARKS="true" #! VIEW_PAGE_BREAKS="false" #! PASSWORD="" #! TITLE="StringAttributeRounder2007" #! CATEGORY="Calculators" #! GRID_HEIGHT="50" #! FME_BUILD_NUM="4398" #! SHOW_INFO_NODES="true" #! DESCRIPTION=""This transformer rounds off numbers that are contained within a string attribute. The user can choose whether the text part of the string is at the start or end of the string. For example: Start Attribute: m234.5555 Text Part At: Start Decimal Places: 2 Result Attribute: m234.56 Start Attribute: 234.5555m Text Part At: End Decimal Places: 2 Result Attribute: 234.56m The transformer also handles <space> characters, for example: Start Attribute: x y234.5555 Text Part At: Start Decimal Places: 2 Result Attribute: x y234.56 "" #! GRID_SNAPTO="false" #! GRID_WIDTH="50" #! ATTR_TYPE_ENCODING="SDF" #! FMX_INSERT_MODE="Embedded by Default" #! > #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! DEFAULT_MACRO ROUNDER_SRC_ATTR LH_text DEFAULT_MACRO ROUNDER_TEXT_LOCATION Start DEFAULT_MACRO ROUNDER_PLACES 2 DEFAULT_MACRO ROUNDER_DEST _rounded #! START_HEADER #! END_HEADER DEFAULT_MACRO WB_CURRENT_CONTEXT DEFAULT_MACRO StringAttributeRounder2007_WORKSPACE_NAME "" INCLUDE [puts {MACRO WB_OLD_CONTEXT_$(StringAttributeRounder2007_WORKSPACE_NAME) $(WB_CURRENT_CONTEXT)}] INCLUDE [puts {MACRO WB_CURRENT_CONTEXT $(StringAttributeRounder2007_WORKSPACE_NAME)}] FACTORY_DEF * TeeFactory FACTORY_NAME "$(StringAttributeRounder2007_WORKSPACE_NAME)_Input Input Splitter" INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Input OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Input # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- DEFAULT_MACRO ROUNDER_TEXT_LOCATION FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_PARAMETERFETCHER INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Input OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_PARAMETERFETCHER_OUTPUT @SupplyAttributes(ENCODED,_rounder_text_location,"$(ROUNDER_TEXT_LOCATION)") # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_Tester INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_PARAMETERFETCHER_OUTPUT TEST @Value(_rounder_text_location) = Start BOOLEAN_OPERATOR OR OUTPUT PASSED FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Tester_PASSED OUTPUT FAILED FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Tester_FAILED # ------------------------------------------------------------------------- MACRO casemac INCLUDE [ if { {no} == {no} } { puts {MACRO casemac -nocase}} ] Tcl2 proc $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_2_replace {} { set findValue [FME_DecodeTextOrAttr {a-z|*}]; set replaceValue [FME_DecodeTextOrAttr {}]; if {{yes} == {yes}} { FME_SetAttribute {_rounder_number} [regsub $(casemac) -all $findValue [FME_GetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_SRC_ATTR)}] $replaceValue] } else { FME_SetAttribute {_rounder_number} [string map $(casemac) [list $findValue $replaceValue] [FME_GetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_SRC_ATTR)}]] }; } FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_2 INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Tester_FAILED OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_2_OUTPUT @Tcl2($(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_2_replace) # ------------------------------------------------------------------------- MACRO casemac INCLUDE [ if { {no} == {no} } { puts {MACRO casemac -nocase}} ] Tcl2 proc $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_replace {} { set findValue [FME_DecodeTextOrAttr {^0-9.*0-9}]; set replaceValue [FME_DecodeTextOrAttr {}]; if {{yes} == {yes}} { FME_SetAttribute {_rounder_text} [regsub $(casemac) -all $findValue [FME_GetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_SRC_ATTR)}] $replaceValue] } else { FME_SetAttribute {_rounder_text} [string map $(casemac) [list $findValue $replaceValue] [FME_GetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_SRC_ATTR)}]] }; } FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_2_OUTPUT OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_OUTPUT @Tcl2($(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_replace) # ------------------------------------------------------------------------- Tcl2 proc $(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_rounder {} { set value 1; catch { if { [string compare [string index {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_PLACES)} 0] {@}] == 0 } { set tmpStr [string range {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_PLACES)} 7 [expr [string length {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_PLACES)}] - 2]]; set value [FME_GetAttribute $tmpStr]; } else { set value {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_PLACES)}; }; set multiplier [expr pow(10,$value)]; FME_SetAttribute {_rounder_rounded_number} [expr "round([FME_GetAttribute {_rounder_number}] * $multiplier) / $multiplier"]; if {$value == 0} { FME_SetAttribute {_rounder_rounded_number} [string replace [FME_GetAttribute {_rounder_rounded_number}] end-1 end] } } } FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_OUTPUT OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_OUTPUT @Tcl2($(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_rounder) # ------------------------------------------------------------------------- Tcl2 set {$(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_valList} [split &_rounder_rounded_number,&_rounder_text ,]; # We use TCL here instead of @Concatenate because TCL is more flexible. Tcl2 proc $(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_concatter {} { global {$(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_valList}; set val {}; foreach {valEnc} [set {$(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_valList}] { append val [FME_DecodeTextOrAttr $valEnc]; }; FME_SetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_DEST)} $val; } FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_OUTPUT OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_OUTPUT @Tcl2($(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_concatter) # ------------------------------------------------------------------------- MACRO casemac INCLUDE [ if { {no} == {no} } { puts {MACRO casemac -nocase}} ] Tcl2 proc $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_3_replace {} { set findValue [FME_DecodeTextOrAttr {^a-z|*}]; set replaceValue [FME_DecodeTextOrAttr {}]; if {{yes} == {yes}} { FME_SetAttribute {_rounder_number} [regsub $(casemac) -all $findValue [FME_GetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_SRC_ATTR)}] $replaceValue] } else { FME_SetAttribute {_rounder_number} [string map $(casemac) [list $findValue $replaceValue] [FME_GetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_SRC_ATTR)}]] }; } FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_3 INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Tester_PASSED OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_3_OUTPUT @Tcl2($(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_3_replace) # ------------------------------------------------------------------------- MACRO casemac INCLUDE [ if { {no} == {no} } { puts {MACRO casemac -nocase}} ] Tcl2 proc $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_4_replace {} { set findValue [FME_DecodeTextOrAttr {0-9.*0-9}]; set replaceValue [FME_DecodeTextOrAttr {}]; if {{yes} == {yes}} { FME_SetAttribute {_rounder_text} [regsub $(casemac) -all $findValue [FME_GetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_SRC_ATTR)}] $replaceValue] } else { FME_SetAttribute {_rounder_text} [string map $(casemac) [list $findValue $replaceValue] [FME_GetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_SRC_ATTR)}]] }; } FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_4 INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_3_OUTPUT OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_4_OUTPUT @Tcl2($(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_4_replace) # ------------------------------------------------------------------------- Tcl2 proc $(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_2_rounder {} { set value 1; catch { if { [string compare [string index {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_PLACES)} 0] {@}] == 0 } { set tmpStr [string range {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_PLACES)} 7 [expr [string length {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_PLACES)}] - 2]]; set value [FME_GetAttribute $tmpStr]; } else { set value {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_PLACES)}; }; set multiplier [expr pow(10,$value)]; FME_SetAttribute {_rounder_rounded_number} [expr "round([FME_GetAttribute {_rounder_number}] * $multiplier) / $multiplier"]; if {$value == 0} { FME_SetAttribute {_rounder_rounded_number} [string replace [FME_GetAttribute {_rounder_rounded_number}] end-1 end] } } } FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_2 INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_StringReplacer_4_OUTPUT OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_2_OUTPUT @Tcl2($(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_2_rounder) # ------------------------------------------------------------------------- Tcl2 set {$(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_2_valList} [split &_rounder_text,&_rounder_rounded_number ,]; # We use TCL here instead of @Concatenate because TCL is more flexible. Tcl2 proc $(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_2_concatter {} { global {$(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_2_valList}; set val {}; foreach {valEnc} [set {$(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_2_valList}] { append val [FME_DecodeTextOrAttr $valEnc]; }; FME_SetAttribute {$($(StringAttributeRounder2007_WORKSPACE_NAME)_ROUNDER_DEST)} $val; } FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_2 INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_ATTRIBUTEROUNDER_2_OUTPUT OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_2_OUTPUT @Tcl2($(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_2_concatter) # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME $(StringAttributeRounder2007_WORKSPACE_NAME)_AttributeExpressionRemover INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_OUTPUT INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Concatenator_2_OUTPUT OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_AttributeExpressionRemover_OUTPUT @RemoveAttributes(fme_regexp_match,_rounder) FACTORY_DEF * TeeFactory FACTORY_NAME "$(StringAttributeRounder2007_WORKSPACE_NAME)_Output Output Collector" INPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_AttributeExpressionRemover_OUTPUT OUTPUT FEATURE_TYPE $(StringAttributeRounder2007_WORKSPACE_NAME)_Output INCLUDE [puts {MACRO WB_CURRENT_CONTEXT $(WB_OLD_CONTEXT_$(StringAttributeRounder2007_WORKSPACE_NAME))}]