Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
I am the chief technical officer at InVision App, Inc - a prototyping and collaboration platform for designers, built by designers. I also rock out in JavaScript and ColdFusion 24x7.
Meanwhile on Twitter
Loading latest tweet...
Ben Nadel at cf.Objective() 2014 (Bloomington, MN) with: Joel Hill and Matt Vickers and Shawn Grigson and Jonathan Rowny and Jonathan Dowdle and Christian Ready and Oscar Arevalo and Jeff McDowell

Creating An ASCII Ruler In ColdFusion

By Ben Nadel on
Tags: ColdFusion

I posted this as a solution to CF-Talk the other day and I thought I would post it here as well (for some reason, not everyone and their mother subscribes to CF-Talk??). Paul Vernon wanted to create an on-screen ASCII ruler that would fully display the powers of 10 (10, 20, 30... 150, 160, etc) but for each non-power-of-10, only display the ones digit (1,2,3,4,5,67,8,9).

My solution builds the output into a two dimensional array. I was treating each character in the output as a sepparate index in the array. Places that has no digit were given a white space character. Then the array is converted to a string using a Java StringBuffer.

I am not 100% sure what this would ever be used for, but here goes:

  • <!--- Get the length of the ASCII ruler. --->
  • <cfset intRulerLength = 150 />
  •  
  • <!---
  • Get the ruler height. This is the number of digits that
  • the max value will have. Since the rule will count up from
  • 1, the max height will be determined by the last value in
  • the ruler (ie. the length of the ruler).
  • --->
  • <cfset intRulerHeight = Len( intRulerLength ) />
  •  
  • <!---
  • Create the array in which to build the output. This is a
  • two-dimensional array. The first index is going to create
  • the ROW of the output (digit column). The Second index is
  • going to be the COLUMN of the output (the index on the ruler.
  • --->
  • <cfset arrRuler = ArrayNew( 2 ) />
  •  
  •  
  • <!---
  • Now, let's start building the ruler output by looping from
  • 1 to the length of the ruler.
  • --->
  • <cfloop index="intColumn" from="1" to="#intRulerLength#">
  •  
  • <!---
  • Check to see if we are at a power of 10 (MOD will not
  • return a remainder). If we are, then we need to display
  • all digits, otherwise, we are just going to display the
  • ones digit column.
  • --->
  • <cfif (intColumn MOD 10)>
  •  
  • <!--- Fill the entire column with spaces. --->
  • <cfloop index="intDigit" from="1" to="#intRulerHeight#">
  •  
  • <cfset arrRuler[ intDigit ][ intColumn ] = " " />
  •  
  • </cfloop>
  •  
  • <!---
  • Now that we have filled the column with spaces, put
  • the ones digit in the last space.
  • --->
  • <cfset arrRuler[ intRulerHeight ][ intColumn ] = (intColumn MOD 10) />
  •  
  • <cfelse>
  •  
  • <!---
  • We need to output the entire value in the output.
  • But, this value might not be the same length as the
  • max value length. Therefore, we need to
  • right-justify the value to fit exactly with the
  • ruler's height.
  • --->
  • <cfset strValue = RJustify(
  • intColumn,
  • intRulerHeight
  • ) />
  •  
  • <!---
  • Now loop over the value and apply to the ruler
  • output array.
  • --->
  • <cfloop index="intDigit" from="1" to="#intRulerHeight#">
  •  
  • <cfset arrRuler[ intDigit ][ intColumn ] = Mid(
  • strValue,
  • intDigit,
  • 1
  • ) />
  •  
  • </cfloop>
  •  
  • </cfif>
  •  
  • </cfloop>
  •  
  • <!---
  • ASSERT: At this point, the entire output for the ASCII ruler
  • should be stored in the ruler array. Now, we need to
  • translate that into a horizontal ruler. To make this faster
  • and control the white space, let's create a Java string
  • buffer to which we can systematically append output data.
  • --->
  • <cfset sbOutput = CreateObject(
  • "java",
  • "java.lang.StringBuffer"
  • ).Init() />
  •  
  •  
  • <!---
  • Loop over the ruler array and append to output. Since we
  • need to output the ruler horizontally, we need to do each
  • row at a time.
  • --->
  • <cfloop index="intDigit" from="1" to="#intRulerHeight#">
  •  
  • <!--- For each row of digits, loop over every column. --->
  • <cfloop index="intColumn" from="1" to="#intRulerLength#">
  •  
  • <!---
  • When appending, we need to convert the array data
  • to a string to make sure Java don't choke.
  • --->
  • <cfset sbOutput.Append(
  • JavaCast(
  • "string",
  • arrRuler[ intDigit ][ intColumn ]
  • )
  • ) />
  •  
  • </cfloop>
  •  
  • <!--- After each row, add a line break. --->
  • <cfset sbOutput.Append(
  • JavaCast(
  • "string",
  • Chr( 13 ) & Chr( 10 )
  • )
  • ) />
  •  
  • </cfloop>
  •  
  • <!--- Output the ASCII data in PRE tags for best formatting. --->
  • <pre>#sbOutput.ToString()#</pre>

This gives us output that looks like this:


 
 
 

 
ASCII Ruler In ColdFusion MX 7  
 
 
 

So, not sure what this is used for, but that's one solution.

Tweet This Interesting post by @BenNadel - Creating An ASCII Ruler In ColdFusion Thanks my man — you rock the party that rocks the body!


Reader Comments

Post A Comment

You — Get Out Of My Dreams, Get Into My Comments
Live in the Now
Oops!
Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.