parent nodes: CPlusPlusApuntesC
Archivo de código: funcionescadenas.cpp
Funciones para trabajar con CStrings o con cadenas del tipo C (char)
Author:* César TM
Date: Marzo 2009
#include "stdafx.h"
#include "funcionesCadenas.h"
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
------------------------
*1 page(s) referring to* [FuncionesCadenasCodigo]
[CPlusPlusApuntesC]
------------------------
*0 page(s) referred to by* [FuncionesCadenasCodigo]
------------------------
#include "cadgenericas.h"
Devuelve el número de veces que el caracter c sale en la cadena s
// Devuelve el número de veces que el caracter c sale en la cadena s
__declspec(dllexport) unsigned int
howManyCharsMach( char c, CString const * const s )
{
#ifdef _DEBUG
ASSERT( ( s != NULL ) && ( c != '\0' ) );
#endif
unsigned int count = 0;
if( ( s != NULL ) && ( c != '\0' ) )
{
unsigned int pos = s->Find( c );
while( pos != -1 )
{
count++;
pos++;
pos = s->Find( c, pos );
}
}
return count;
}
Monta un array con una cadena de valores delimitados
// recibe una cadena que contiene un caracter separador
// rellena las posiciones del array con las subcadenas resultantes de separar la cadena
// grande por el caracter separador
__declspec(dllexport) void
parseStringIntoArray( CString const * const s, CArray<CString,CString> * p, char sep )
{
#ifdef _DEBUG
ASSERT( ( p != NULL ) && ( s != NULL ) && ( sep != '\0' ) );
#endif
if( ( p != NULL ) && ( s != NULL ) && ( sep != '\0' ) )
{
p->RemoveAll();
CString aux = (*s); //copia para no modificar la cadena original
CString parte = _T( "" );
int pos = aux.Find( sep );
while( pos != -1 )
{
try
{
parte = aux.Left( pos );
aux = aux.Mid( pos + 1 );
p->Add( parte );
}
catch( CMemoryException * e )
{
AfxMessageBox( _T( "No hay memoria suficiente en el sistema\nCierre una o varias aplicaciones y vuelva a intentarlo." ) );
delete e;
return;
}
pos = aux.Find( sep );
}
try
{
parte = aux;
p->Add( parte );
}
catch( CMemoryException * e )
{
AfxMessageBox( _T( "No hay memoria suficiente en el sistema.\nCierre una o varias aplicaciones y vuelva a intentarlo." ) );
delete e;
return;
}
}
}
Monta una fecha válida a partir de una cadena
// Esta función recibe una cadena y devuelve un objeto COleDateTime
// Funciona como la función COleDateTiem::ParseDateTime(...) pero,
// a diferencia de esa función, esta comprueba que la fecha sea válida
// en el formato de fecha elegido en el Útiles>parametrización.
// Ver: http://support.microsoft.com/kb/241893
__declspec(dllexport)
COleDateTime CreateDateFromStr( CDatosGenerales * gen, const CString & str )
{
COleDateTime ret;
ret.SetStatus( COleDateTime::null ); // Literally has no value
if( (&str) != NULL && !str.IsEmpty() )
{
// Separa la fecha en un array de tres cadenas
char separator = '/';
CArray<CString,CString> * p = NULL;
try
{
p = new CArray<CString,CString>;
p->SetSize( 3 );
}
catch( CMemoryException * e )
{
AfxMessageBox( _T( "No hay memoria suficiente en el sistema\nCierre una o varias aplicaciones y vuelva a intentarlo." ) );
delete e;
delete [] p;
ret.SetStatus( COleDateTime::null ); // Literally has no value
return ret;
}
parseStringIntoArray( &str, p, separator );
// Pasa esas tres cadenas a las variables numéricas según el formato de fecha
if( gen->m_formato_fecha == FORMATO_FECHA_INGLES ) // mes/dia/año
{
unsigned short day = atoi( ( p->GetAt( 1 ) ).GetBuffer( ( p->GetAt( 1 ) ).GetLength() ) );
unsigned short month = atoi( ( p->GetAt( 0 ) ).GetBuffer( ( p->GetAt( 0 ) ).GetLength() ) );
unsigned short year = atoi( ( p->GetAt( 2 ) ).GetBuffer( ( p->GetAt( 2 ) ).GetLength() ) );
ret.SetDate( year, month, day );
}
else // formato por defecto: dia/mes/año
{
unsigned short day = atoi( ( p->GetAt( 0 ) ).GetBuffer( ( p->GetAt( 0 ) ).GetLength() ) );
unsigned short month = atoi( ( p->GetAt( 1 ) ).GetBuffer( ( p->GetAt( 1 ) ).GetLength() ) );
unsigned short year = atoi( ( p->GetAt( 2 ) ).GetBuffer( ( p->GetAt( 2 ) ).GetLength() ) );
ret.SetDate( year, month, day );
}
delete [] p;
}
return ret;
}
Rellena una cadena por la izquierda o la derecha, repitiendo un carácter, hasta un tamaño dado
// Completa la cadena rStr con el caracter c tantas veces como sea necesario para que el tamaño de rStr sea igual
// al tamaño pasado por parámetro. Sí toTheRight es TRUE (añade por la derecha) tendremos la cadena original seguida de caracteres
// si es FALSE (añade por la izquierda) tendremos primero los caracteres y después la cadena original.
__declspec(dllexport)
void FullFillString( CString & rStr, const char c, const unsigned short size, BOOL toTheRight )
{
short fault = size - rStr.GetLength();
if( fault > 0 )
{
CString aux( c, fault );
if( toTheRight == TRUE ) // adds to the right side
{
rStr += aux;
}
else // adds to the left side
{
rStr = aux + rStr;
}
}
}
Crea una cadena con N caracteres iguales
Usar el constructor por argumentos de CStringCString blancos( ' ', ( posBlancos.fin() - posBlancos.ini() + 1 ) );
Quita últimos ceros decimales detrás de un punto o coma
Ahora tengo esta función en inclacol//CCriterioApuntes si fuese útil para otras partes del código habría que sacarla de esta clase.
// Se le pasa una cadena que contiene un número por ejemplo "1000.00"
// La función quita los ceros que hay a la derecha del punto decimal
// Si es necesario quitará también el punto.
// Funciona igual si la cadena usa una coma en lugar de un punto decimal
// pero en ese caso la cadena de retorno habrá cambiado la coma por el punto.
// No redondea decimales.
//
// "1000.00" ------> "1000"
// "1000.0020" ----> "1000.002"
// "3518,01200" --> "3518.012"
void
CCriterioApuntes::quitaCerosDecimales( CString &rNum )
{
int positionDecimalDot = rNum.FindOneOf( "," );
if( positionDecimalDot != -1 )
{
rNum.SetAt( positionDecimalDot, '.' );
}
else
{
positionDecimalDot = rNum.FindOneOf( "." );
}
if( positionDecimalDot != -1 )
{
// quitar los ceros desde el punto hacia la derecha
rNum.TrimRight( '0' );
// si el punto es el último caracter quitarlo
int length = rNum.GetLength();
char c = rNum.GetAt( length - 1 ) ;
if( c == '.' )
rNum.TrimRight('.');
}
}
_________________________________________________________________________________________________________
CPlusPlusApuntesC [camelCaseWordsEnabled: false]