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 CString
CString 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]