Necesito escibir en un fichero de texto registros. Cada uno de estos
registros
es una String formada a su vez por varios "objetos" con la condicion de que
cada
uno de ellos debe aparecer en una posición concreta de la String.
Por ejemplo, los 3 primeros caracteres deben contener un int de 3 o
menos cifras (si es de menos se debe rellenar con ceros), los 40 siguientes
deben
ser el nombre de una persona (si no llegan a los 40 caracteres deben quedar
vacios, es decir, relleno de espacios y ademas alineados a la derecha), los
13 siguientes son un double,...
Un ejemplo:
"023_________________________EMILIO ARELLANO0000134000.91"
Lo que hago es crear un StringBuffer y utilizar el metodo append para ir
añadiendo cada parte de la String.
El problema de los int y los double lo he solucionado utilizando la
clase java.text.DecimalFormat, pero con las Strings no he encontrado
nada parecido. ¿Alguien me puede echar una mano?
--
------------------------------------------
| |
| Emilio José Arellano Cruz |
| |
------------------------------------------
| emilio_...@hotmail.com | ZARAGOZA |
| 434...@cepsz.unizar.es | |
| arel...@tb-solutions.com | (ESPAÑA) |
------------------------------------------
package com.utils.jutil;
/**
* Título: recambios
* Descripcion:
* Copyright: Copyright (c) 2001
* Empresa: xxxxx
* @author xx.xx.x..x
* @version 1.0
*/
import java.math.BigDecimal;
public class Padder {
/**
* Vacío
*/
public Padder() {
}
/**
* Recibe un entero, Numero, a convertir y otro con el tamaño de la
cadena que queremos
* <br>Devuelve ceros a la izquierda
*/
public String padIntL(int Numero, int Size){
String result="";
String Num;
try{
Num = Integer.toString(Numero);
for(int i=0;i<Size -Num.length();i++)
result = result +"0";
result = result + Num;
}
catch (Exception E){
E.printStackTrace();
};
return result;
}
/**
* Recibe un int (Numero) a convertir y otro con el tamaño de la cadena
que queremos (Size)
* <br>Devuelve ceros a la izquierda
*/
public String padIntL(String Numero, int Size){
String result="";
try{
for(int i=0;i<Size - Numero.length() ;i++)
result = result + "0";
result = result + Numero;
}
catch (Exception E){
E.printStackTrace();
};
return result;
}
/**
* Recibe una cadena, Frase, y devuelve otra con tamaño Size y espacios
a la izquierda
*/
public String padStringL(String Frase, int Size){
String result = "";
for(int i=0;i<Size -Frase.length();i++)
result = result +" ";
result = result + Frase;
return result;
}
/**
* Recibe una cadena, Frase, y devuelve otra con tamaño Size y espacios
a la derecha
*/
public String padStringR(String Frase, int Size){
/**
* @see String
*/
String result="";
//
// for (int i=0; i<Size-1; i++)
// temp = temp + " ";
// StringBuffer result = new StringBuffer(temp);
// result.replace(0,Frase.length()-1,Frase);
if (Frase.length()>Size)
result = Frase.substring(0,Size);
else{
for (int i=0; i < Size - Frase.length(); i++)
result = result + " ";
result = result + Frase;
}
return result.toString();
}
/**
* Recibe un Numero, el tamaño deseado de la cadena que devuelve y los
decimales que queremos
*/
public String padFloat(float Numero, int Size, int precision){
String result="";
String Tmp1 ="";
String Tmp2="";
int decimales=0;
boolean decimal=false;
try{
BigDecimal num = new BigDecimal(""+Numero).setScale(precision);
Tmp1 = "" + num.floatValue();
//cojemos parte entera y decimal sin la coma
for(int i=0; i<Tmp1.length();i++){
if (Tmp1.substring(i,i+1).equalsIgnoreCase(".")){
decimal = true;
continue;
}
if (decimal)
++decimales;
Tmp2 = Tmp2 + Tmp1.substring(i,i+1);
// System.out.println("Antes :"+Numero);
// System.out.println("Cadena "+Tmp2);
}
//añadimos ceros a la derecha de los decimales que nos pide precisión
if (decimales < precision){
for (int i=0;i<precision - decimales; i++)
//añadimos ceros a la derecha
Tmp2 = Tmp2 + "0";
}
//rellenamos ceros a la izquierda
for(int i=0;i<Size - Tmp2.length() ;i++)
result = result + "0";
result = result + Tmp2;
// System.out.println("Result "+Tmp2);
}
catch (Exception E){
E.printStackTrace();
}
finally{
return result;
}
}
/**
/* Se le pasa una cadena (sólo con números) y un entero indicando el
número de decimales que contiene
/* Devuelve un float
*/
public float padFloatfromString(String Numero,int Precision){
float result =0;
BigDecimal num = null;
String nuevo ="";
String entero= Numero.substring(0, Numero.length() - Precision);
String decimal=Numero.substring(Numero.length() - Precision,
Numero.length());
nuevo = entero +"."+ decimal;
try{
num = new BigDecimal(nuevo);
}
catch (Exception E){
E.printStackTrace();
}
finally{
return num.floatValue();
}
}
/**
/* Se le pasa una cadena numérica con ceros a la izquierda.
/* Devuelve la misma pero sin los ceros.
*/
public String quitaCeros(String Numero){
String result = "";
int primero = 0;
for (primero = 0; primero < Numero.length(); primero++){
if (!Numero.substring(primero,primero + 1).equalsIgnoreCase("0"))
break;
}
result = Numero.substring (primero, Numero.length());
return result;
}
}
Yo pensaba que habria alguna clase como java.text.DecimalFormat para String
dentro del API de SUN y que no encontraba.
Por eso pregunté. De todas formas te agradezco que me mandes el código. Me
ha servido de mucho.
"Chete" <av...@telepolis.com> wrote in message
news:a8co4p$r31e2$1...@ID-126020.news.dfncis.de...
Ahora que veo la clase BigDecimal, he de decir que esta clase no me funciono
correctamente con el jdk1.2.2 sobre una maquina unix con solaris
Chete escribió en mensaje ...