import groovy.swing.SwingBuilder

class StreckenCategory {
  static def getKm(selbst) {
    selbst
  }

  static def getM(selbst) {
    selbst / 1000
  }
}

def werteAus(string) {
  def km = evaluate(parse(string)) as String
  def formatierteKm = formatiere(km)
  "${formatierteKm} km"
}

def parse(string) {
  string
      .replaceAll(/(\d+),(\d+)/, { alle, km, m -> "${km}.${m}" })
      .replaceAll(/ (k*m)/, { alle, km -> ".${km}"})
}

def formatiere(string) {
  string.replaceAll(/(\d+).(\d+)/, { alle, km, m -> "${km},${m}" })
}

use (StreckenCategory.class) {
  assert '20,5 km' == werteAus('2 * 2 km + 6 * 300 m + 5 * 100 m + 14,2 km')
}

def swing = new SwingBuilder()
def frame = swing.frame(title:'Kilometerfresser') {
  textField(columns:100, actionPerformed: { event ->
    use (StreckenCategory.class) {
      event.source.setText(werteAus(event.source.text))
    }
  })
}
frame.pack()
frame.show()